我想有2个单独的布局在我的应用程序。让我们说一个是为网站的公共部分,另一个是为会员方。
为了简单起见,我们假设每个站点的所有逻辑都被整齐地包装在两个不同的控制器中。
PublicController
StaffController
它们每个都有一个对应的视图布局。
_PublicLayout.cshtml
_StaffLayout.cshtml
我如何使用_ViewStart。cshtml文件指定“公共”下的所有视图/操作使用的PublicLayout和“人员”下的一切使用的StaffLayout?
你可以放一个_ViewStart。/Views/Public文件夹中的cshtml文件将覆盖/Views文件夹中的默认文件,并指定所需的布局:
@{
Layout = "~/Views/Shared/_PublicLayout.cshtml";
}
通过类比,你可以放另一个_ViewStart。在/Views/Staff文件夹中的cshtml文件:
@{
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();
}
你可以放一个_ViewStart。/Views/Public文件夹中的cshtml文件将覆盖/Views文件夹中的默认文件,并指定所需的布局:
@{
Layout = "~/Views/Shared/_PublicLayout.cshtml";
}
通过类比,你可以放另一个_ViewStart。在/Views/Staff文件夹中的cshtml文件:
@{
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();
}