[英]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";
}
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";
}
}
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.