我希望在我的应用程序中有2个单独的布局.假设一个是网站的公共部分,另一个是空的,原因我们需要.
在Core之前我可以这样做来定义一个过滤器:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
现在ViewResult没有MasterName属性.是否可以立即执行,而不是在查看布局定义中使用.
Dan*_*.G. 27
您仍然可以执行与原始方法非常相似的操作,使用ViewData传递布局名称(虽然我将其创建为结果过滤器):
public class ViewLayoutAttribute : ResultFilterAttribute
{
private string layout;
public ViewLayoutAttribute(string layout)
{
this.layout = layout;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
var viewResult = context.Result as ViewResult;
if (viewResult != null)
{
viewResult.ViewData["Layout"] = this.layout;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在_ViewStart.cshtml文件中:
@{
Layout = (string)ViewData["Layout"] ?? "_Layout";
}
Run Code Online (Sandbox Code Playgroud)
最后,假设您创建了一个新的布局Views/Shared/_CleanLayout.cshtml,您可以在任何控制器或操作上使用该属性:
[ViewLayout("_CleanLayout")]
public IActionResult About()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
San*_*ket 19
这就是我在ASP.NET核心MVC应用程序中使用多个布局的方式.
你可以尝试这样 -
在_ViewStart.cshtml指定默认_Layout像这样 -
@{
Layout = "_Layout";
}
Run Code Online (Sandbox Code Playgroud)
如果您想设置页面特定的布局,那么page.cshtml您可以分配其他视图,如下所示 -
@{
Layout = "~/Views/Shared/_Layout_2.cshtml";
ViewData["Title"] = "Page Title";
}
Run Code Online (Sandbox Code Playgroud)
看看这是否有帮助.
如果要根据某些条件使用不同的布局,可以在_ViewStart.cshtml文件中使用以下代码:
@{
if (some condition)
{
Layout = "_Layout1";
}
else if (some other condition)
{
Layout = "_Layout2";
}
etc.
}
Run Code Online (Sandbox Code Playgroud)
我在我的一个项目中使用了它。在我的情况下User.IsInRole("admin"),我的_ViewStart.cshtml文件如下:
@{
if (User.IsInRole("admin"))
{
Layout = "_AdminLayout";
}
else
{
Layout = "_Layout";
}
}
Run Code Online (Sandbox Code Playgroud)
由于我的项目中只有两个角色,因此只会导致一种情况,因此,对于我来说,这种解决方法还不错。我希望处于类似情况的人会发现这很有用:)
您可以使用IViewLocationExpander界面来根据需要渲染视图。请参阅此链接Working with IViewLocationExpander in mvc了解更多详细信息
问候,
罗希特
| 归档时间: |
|
| 查看次数: |
17302 次 |
| 最近记录: |