在MVC中授权视图的部分

3
我在想是否有可能在视图内授权部分内容。
例如,我知道如何使用这种方法授权整个控制器。
<HandleError()> _
Public Class HomeController
  Inherits System.Web.Mvc.Controller

  Function Index()
    Return View()
  End Function

  <Authorize(Roles:="Administrators")> _
  Function AdministratorSecrets()
    Return View()
  End Function

End Class

如果管理员已登录,我想让他们在我的导航栏中看到额外的链接。
大致如下:
            <ul id="menu">              
                <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
                <li><%= Html.ActionLink("About", "About", "Home")%></li>
                <Authorize(Roles:="Administrators")> _
                <li><%= Html.ActionLink("Admin", "Admin", "Home")%></li>
            </ul>

显然这不可行,但它给出了我试图实现的想法。
有任何想法吗?
2个回答

4

使用类似以下的方式:

<% if(Roles.IsUserInRole("Administrator")){ %>
<span>HTML Code</span>
<% } %>

1
您可能需要考虑采用这种方法的长期可维护性。我更愿意看到视图的模型具有一个名为CanSeeAdminSecrets的标志,并使用Roles.IsUserInRole方法从控制器设置该标志。系统中管理员的定义在以后可能会发生变化,将管理员是什么的逻辑放在控制器中更有意义。不过这只是个人偏好。 - Jab
如果你要实现这个功能,最好将这段代码放在 Roles 类的拓展方法中——将其添加到模型中只会将定义从多个视图移动到大约相同数量的控制器操作中。如果它是一个拓展方法,定义将在一个位置上。 - Paul
这是我写的一个相当完整的例子。http://codereview.stackexchange.com/questions/54118/asp-net-mvc-features-based-authorization。您需要根据这个概念编写自己的数据库表,但它应该可以工作。 - jwize

0

将if语句发送到新的HTML助手扩展方法是最佳实践。


请在提供信息时添加一些参考文献。 - jwize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接