繁体   English   中英

在ASP.NET MVC中更改视图的布局(母版页)而不重新创建它

[英]Change Layout(Master Page) of view in ASP.NET MVC without recreate it

我正在使用带有Razor视图的ASP.NET MVC 3。 如果要创建视图,可以为视图选择布局(母版页),或者选择“默认”(_Layout)。

我很有兴趣在创建视图后更改此布局而不重新创建它,是否有任何地方存储有关视图的布局信息? 我该怎么改变它?

在MVC3中,你有_ViewStart.cshtml来存储所有页面的布局; 您可以更改此元素以更改所有页面的布局,或者您可以在@{}块中的目标视图页面顶部添加新的Layout元素,如下所示,以更改特定页面的布局:

@{
    Layout = "~/Views/Shared/_newLayout.cshtml";
    ViewBag.Title = "Index";
}

在cshtml文件的顶部创建视图后,您可以看到包含的布局。

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

您可以简单地替换它,例如使用不同的布局

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

此外,您可以将其存储在基本布局( _ViewStart.cshtml )中,然后您的所有视图都将使用该布局。

根据您的需要,有多种方法可以为视图指定不同的布局:

在视图中

如其他答案所述,只需更改视图的Layout属性:

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

在_ViewStart.cshtml中

MVC 3 添加了一个默认的 Views/_ViewStart.cshtml ,您可以在其中放置由所有视图共享的逻辑。 您还可以在任何Views子目录中创建其他_ViewStart.cshtml文件以获取其他自定义逻辑(它将在层次结构和Shared文件夹中搜索,就像查找任何其他视图或部分视图一样)。

将大量业务逻辑纳入其中就像是违反了“关注点分离”原则,但同时它也非常方便。

请注意, _ViewStart.cshtml继承自StartPage ,而不是WebPage ,因此它的属性可能与您习惯的略有不同(例如,您必须通过ViewContext来获取ViewBag )。

@{
    if (ViewContext.ViewBag.IsAdmin) // or other custom logic
    {
        Layout = "~/Views/Shared/_AdminLayout.cshtml";
    }
    else
    {
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
}

在Controller动作中

View()方法有一个重载,它采用一个显式的布局页面(Intellisense将其称为“主页面”):

    public ActionResult FooAction()
    {
        var model = new MyModel();

        return View("Index", "_CustomLayout", model);
    }

我们可以使用以下代码在_ViewStart文件中更改布局的默认呈现:

@{
 var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();

 string layout = "";
 if (controller == "Admin")
 {
 layout = "~/Views/Shared/_AdminLayout.cshtml";
 }
 else
 {
 layout = "~/Views/Shared/_Layout.cshtml";
 }

 Layout = layout;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM