问题描述: 如何在同一应用程序中应用两套布局视图,两个不同控制器对应的使用两套不同的视图,如PublicControlller对应_PublicLayout而StuffController对应_StuffLayout,
如何通过在_ViewStart文件中进行相关设置使得View/Public文件夹下的文件默认使用的_PublicLayout布局页,而View/Stuff文件夹下的文件默认使用的_StuffLayout布局页。
解决方案:
1)可以在各自文件夹中放置新的_ViewStart.cshtml文件改写View文件夹下的_ViewStart并制定使用特定的_Layout布局页。如View/Public和View/stuff文件夹下各自有
自己的_ViewStart文件设置布局页面。
2)在controller下的action方法中指定使用某个布局页面,如
returnView("Index","~/Views/Shared/_StaffLayout.cshtml", someViewModel);
3)自定义一个AcitonFilter类在调用执行action时来改写使用的布局页
publicclassLayoutInjecterAttribute:ActionFilterAttribute
{
privatereadonlystring _masterName;
publicLayoutInjecterAttribute(string masterName)
{
_masterName = masterName;
}
publicoverridevoidOnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.ResultasViewResult;
if(result !=null)
{
result.MasterName= _masterName;
}
}
}
通过在controller下的action方法添加特性来指定选择某特定布局页
[LayoutInjecter("_PublicLayout")]
publicActionResultIndex()
{
returnView();}
}
http://forums.asp.net/t/1642656.aspx/1
问题描述:在_ViewStart文件中使用ViewBag对象
解决方案:(可通过此方法根据特定参数来切换布局页实现多语言网站设计)
设置:ViewContext.Controller.ViewBag.StoreName = "My New Store";
使用:@ViewContext.Controller.ViewBag.StoreName
Generally, ViewData["StoreName"] is same as ViewBag.StoreName
Also, Controller.ViewData["StoreName"] = Controller.StoreName = ViewContext.Controller.ViewBag.StoreName =ViewContext.Controller.ViewData["StoreName"]
But every view and partial view gets its own instance of viewdata.