ASP MVC 3在不同视图中使用不同的布局

28

我有一个ASP MVC应用程序,需要多个不同的布局。在ASP.NET Web Apps中,我只需创建不同的主模板即可。那么在ASP MVC 3中如何实现呢?

目前我已经为每个需要的布局创建了单独的Layout.cshtml文件。

我尝试在视图中设置布局,但是它被ViewStart.cshtml覆盖,ViewStart.cshtml将其重新设置为网站的默认布局。

此外,我似乎无法让Razor智能感知工作,因此我还不能探索在ViewStart中可以做什么,例如是否可以有条件地设置布局等。

您有什么想法吗?


请参考以下链接:http://stackoverflow.com/questions/5617631/dynamic-layout-for-error-view-in-asp-net-mvc - ATechieThought
3个回答

56

您可以在控制器操作中动态设置布局:

public ActionResult Index()
{
    var viewModel = ...
    return View("Index", "_SomeSpecialLayout", viewModel);
}

17

您可以通过在顶部编写 @{ Layout = "~/.../Something.cshtml"; } 来手动设置视图的布局。

编辑:您可以将布局名称作为参数传递给控制器中的 View() 方法。


3
抱歉,我正在寻找一种使其具有动态性的方法。与其为每个布局单独创建一个视图,我更愿意使用相同的视图并更改它们的布局。 - Adam
1
为了方便起见 - 如果您的文件夹结构与 ~/Views/Shared/ 匹配,那么这个技巧就可以派上用场 @{Layout = "~/Views/Shared/_YourLayout.cshtml";} - surfmuggle

2

对于初学者来说,这是一种控制ASP.NET MVC应用程序的布局渲染最简单的方法。我们可以根据控制器来识别并呈现布局。为此,我们要在视图文件夹的根目录下编写我们的代码,放在_ViewStart文件中。以下是如何实现的示例。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接