我想在我的应用程序中有 2 个单独的布局。假设一个用于网站的公共部分,另一个用于会员端。
为简单起见,假设每个站点的所有逻辑都整齐地包装在 2 个不同的控制器中。
公共控制器
员工控制器
并且它们每个都有一个对应的布局,用于每个视图下的所有视图。
_PublicLayout.cshtml
_StaffLayout.cshtml
如何使用 _ViewStart.cshtml 文件来指定“Public”下的所有视图/操作都使用 PublicLayout,而“Staff”下的所有内容都使用 StaffLayout?
Razor
视图的布局,只需设置 Layout = null;
您可以将 _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();
}
另一种方法是在视图中定义布局:
@{
Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
}
更多方法,可以找到here,希望这对某人有所帮助。
此方法是初学者在 ASP.NET MVC 应用程序中控制布局呈现的最简单方法。我们可以识别控制器并将 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;
}
不定期副业成功案例分享
LayoutInjecterAttribute
。 ?有什么特别的位置吗?ActionFilters
子文件夹中。LayoutInjecterAttribute
的一个潜在问题是:它在控制器的OnException
方法之前被调用。因此,如果控制器在异常处理期间提供视图结果,则不会设置布局。