我在我的_Layout.cshtml中使用
这样做可以达到我的要求(非编辑人员无法创建新项目),但所有人都能看到“创建条目”的选项。我可以这样做:
@RenderSection("Contextual", false)
,以允许不同的视图在那里呈现它们特定的内容。有些没有,有些有。
此外,我使用基于角色的安全性和ActionFilter来控制特定用户是否可以访问我的网站上的特定控制器操作和路由。
我想要做的是在我的_Layout.cshtml上提供一个@RenderSection("Contextual", false)
部分,然后让特定页面提供任何对该页面有意义的上下文内容并且让相应的控制器处理用户是否可以执行操作的审核,甚至可以看到选项存在,但我不确定我是否正确地考虑了这个问题。目前的情况如下:
现在,我在我的Index.cshtml文件中有一个部分,如下所示:
@section Contextual {
<div>@Html.ActionLink("Create New", "Create")</div>
<div>@Html.ActionLink("Generate Report", "Report")</div>
<div>@Html.ActionLink("Other Stuff", "Other")</div>
}
然后在我的相应控制器中,我有以下内容:
[Authorize(Roles = "Editor")]
public ActionResult Create()
{
// stuff
}
这样做可以达到我的要求(非编辑人员无法创建新项目),但所有人都能看到“创建条目”的选项。我可以这样做:
@section Contextual {
@if (User.IsInRole("Editor"))
{
<div>@Html.ActionLink("Create New", "Create")</div>
}
<div>@Html.ActionLink("Generate Report", "Report")</div>
<div>@Html.ActionLink("Other Stuff", "Other")</div>
}
这样做足以很好地隐藏“创建”链接,使非编辑人员无法看到,但我对是否以这种方式处理还持观望态度。我可以看到,将来规则发生变化时,我将面临两个位置需要保持同步:控制器操作的属性和视图中的代码。
这是一个合理的方法吗?有更好的方法来处理吗?