我编写了一个源自System.Web.Mvc.AuthorizeAttribute的自定义授权属性。我正在从我的控制器中成功使用它来限制对某些功能的访问。
public class ArticleController : Controller
{
[CustomAuthorize(Role.Administrator)]
public ActionResult Delete(int id)
{
// ...
}
}
这很好用。现在我想根据相同的授权逻辑显示或隐藏HTML元素。例如,在我的视图“文章”中,如果用户不是管理员,我想隐藏操作按钮“删除”。我写过类似的东西:
<ul id="menu">
<li>@if (User.IsInRole(Role.Administrator)) {
@Html.ActionLink("Delete", "Delete", "Article", new { id = article.ID }, null)
} </li>
</ul>
它的工作正常,但它会创建代码逻辑重复,因为我需要指定两次必要的信用来执行操作:
避免这种重复的最佳方法是什么?有没有办法从视图中重用我的自定义授权属性?
答案 0 :(得分:3)
自定义助手应该是最佳选择,例如:
@Html.SecureActionLink("Delete", "Delete", "Article")
此帮助程序将检查某种服务,以查看当前用户/角色是否具有此链接的权限。
答案 1 :(得分:1)
使菜单成为局部视图。
答案 2 :(得分:1)
我会为此创建自定义html助手。
public MvcHtmlString AuthorizedActionLink(this HtmlHelper htmlHelper,
string actionName, ... , Role role)
如果您认为Role参数是多余的,您可以使用Reflection检查控制器操作并自动确定允许的角色。