如何在运行时替换当前布局?

时间:2015-03-09 08:24:19

标签: asp.net-mvc

我有一个小应用程序(asp.net mvc)。 我有一个问题:在我的项目中我有一个布局 - _layout.chtml, 是否可以用从文件中注入的不同内容替换内容?

例如: 当前_layout.chtml:

<!DOCTYPE html>
<html>
<head>
</head>
<body>      
    @RenderBody()
</body>
</html>

现在,我想从文件中加载新内容,并将当前的_layout替换为新内容,如下所示:

<!DOCTYPE html>
<html>
<head>
<title>My Title</title>
<link href="~/css/mycss.css" rel="stylesheet" />
</head>
<body>   
    @RenderPage("../Shared/_Header2.cshtml")    
    @RenderBody()
    @RenderPage("../Shared/_Footer2.cshtml")

    <script src="~/scripts/jquery.js"></script>
    <script src="~/scripts/angular.js"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

我该怎么做? 谢谢!

2 个答案:

答案 0 :(得分:1)

如果您不想以其他方式覆盖_ViewStart.cshtml

return View ("NameOfView",masterName:"viewName");

或者 将您的布​​局存储在viewData中,如

//in controller
ViewData["Layout"]="your layout path";
//in _ViewStart.cshtml
Layout = ViewData["Layout"];

或者您可以创建自定义属性并在其中设置您的布局名称,如

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

有关详细信息,请查看此答案specify different Layouts

答案 1 :(得分:0)

我假设您在要替换布局时调用新的控制器操作。如果是这样,那么以下其中一个就可以做到这一点;

首先,您可以在_ViewStart.cshtml文件夹中放置\Views\文件,以覆盖默认布局,如下所示。

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

在此处,您可以在_ViewStart.cshtml中添加另一个\Views\User文件,以覆盖所有\User\次观看的默认布局。

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

您还可以在视图中指定上述内容,例如为\Views\User\Index.cshtml

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

或者您可以在控制器中返回视图时指定布局;

return View("Index", "~/Views/Shared/_UserLayout.cshtml", someViewModel);