我想在我的应用程序中有2个单独的布局。假设一个是网站的公共部分,另一个是会员方。
为简单起见,我们可以说每个网站的所有逻辑都整齐地包含在2个不同的控制器中。
并且它们每个都有相应的布局,用于每个视图下的所有视图。
如何使用_ViewStart.cshtml文件指定“Public”下的所有View / Action使用PublicLayout,“Staff”下的所有内容都使用StaffLayout?
谢谢!
答案 0 :(得分:545)
您可以在_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();
}
答案 1 :(得分:29)
答案 2 :(得分:14)
此方法是初学者控制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"如何在ASP.NET MVC中渲染不同的布局"