【发布时间】:2011-08-19 14:37:18
【问题描述】:
我在我的_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>
}
而且效果很好,对非编辑者隐藏了“创建”链接,但我对这样处理它是否合适持怀疑态度,而且我可以看到在路上我已经得到了规则更改的情况,然后我有两个位置要保持同步:控制器操作上的属性和视图中的代码。
这是一个合理的方法吗?有没有更好的方法来解决这个问题?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 roles