首页 文章

如何在ASP.NET MVC 3 razor ViewStart文件中指定不同的布局?

提问于
浏览
301

我希望在我的应用程序中有2个单独的布局 . 假设一个是网站的公共部分,另一个是会员方面 .

为简单起见,我们可以说每个站点的所有逻辑都整齐地包含在2个不同的控制器中 .

  • PublicController

  • StaffController

并且它们每个都具有相应的布局,用于每个视图下的所有视图 .

  • _PublicLayout.cshtml

  • _StaffLayout.cshtml

如何使用_ViewStart.cshtml文件指定“Public”下的所有View / Action使用PublicLayout,“Staff”下的所有内容都使用StaffLayout?

谢谢!

3 回答

  • 14

    您可以将 _ViewStart.cshtml 文件放在 /Views/Public 文件夹中,该文件将覆盖 /Views 文件夹中的默认文件并指定所需的布局:

    @{
        Layout = "~/Views/Shared/_PublicLayout.cshtml";
    }
    

    通过类比,您可以将另一个 _ViewStart.cshtml 文件放在 /Views/Staff 文件夹中:

    @{
        Layout = "~/Views/Shared/_StaffLayout.cshtml";
    }
    

    您还可以指定在控制器操作中返回视图时应使用的布局,但是每个操作:

    return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);
    

    另一种可能性是自定义动作过滤器,它将覆盖布局 . 你可以看到实现这一目标的许多可能性 . 由您决定哪种方案最适合您的方案 .


    更新:

    根据评论部分的要求,这是一个动作过滤器的示例,它将选择一个母版页:

    public class LayoutInjecterAttribute : ActionFilterAttribute
    {
        private readonly string _masterName;
        public LayoutInjecterAttribute(string masterName)
        {
            _masterName = masterName;
        }
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            var result = filterContext.Result as ViewResult;
            if (result != null)
            {
                result.MasterName = _masterName;
            }
        }
    }
    

    然后使用此自定义属性指定控制器或操作,指定所需的布局:

    [LayoutInjecter("_PublicLayout")]
    public ActionResult Index()
    {
        return View();
    }
    
  • 29

    另一种方法是在视图中定义布局:

    @{
        Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
        }
    

    更多的方法,可以找到here,希望这有助于某人 .

  • 537

    此方法是初学者在ASP.NET MVC应用程序中控制Layouts渲染的最简单方法 . 我们可以识别控制器并将Layouts渲染为par控制器,为此,我们可以在Views文件夹的根目录中的_ViewStart文件中编写代码 . 以下是一个示例,说明如何完成 .

    @{
                 var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
                 string cLayout = "";
                if (controller == "Webmaster") {
                      cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
                     }
                   else {
                    cLayout = "~/Views/Shared/_Layout.cshtml";
                   }
            Layout = cLayout;
             }
    

    阅读完整文章here "How to Render different Layout in ASP.NET MVC"

相关问题