【发布时间】:2015-12-10 20:20:54
【问题描述】:
目前,我使用继承自 WebViewPage 的抽象类来为 MVC 项目中的 razor 视图提供功能。我们正在使用自定义登录类/解决方案。我的班级是这样的:
public abstract class AuthenticatedViewPageBase : WebViewPage
{
private Login _user;
protected override void InitializePage()
{
_user = Session["User"] as Login;
}
public bool HasPermission(Permissions permission)
{
return HasPermission(new List<Permissions> { permission });
}
public bool HasPermission(List<Permissions> permissions)
{
if (_user == null)
_user = Session["User"] as Login;
return _user != null && permissions.Any(thisPerm => _user.Permissions.Any(p => p.PermissionId == (int)thisPerm));
}
public bool HasPermission(List<Permissions> permissions, List<PermissionGroups> groups)
{
if (_user == null)
_user = Session["User"] as Login;
return _user != null &&
(
permissions.Any(thisPerm => _user.Permissions.Any(p => p.PermissionId == (int)thisPerm))
||
groups.Any(thisPerm => _user.Permissions.Any(p => p.PermissionGroupId == (int)thisPerm))
);
}
}
我的观点是这样的:
@using PublicationSystem.Model.Enums
@model IEnumerable<PublicationSystem.Model.Profile>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_LayoutSmBanner.cshtml";
}
@if (HasPermission(new List<Permissions>
{
Permissions.userCreate
}))
{
<p>
@Html.ActionLink("Create New", "Create")
</p>
}
这工作正常,但我希望能够清理它。我很想在我的 AuthenticatedViewPageBase 中有一个属性并创建一个增强的 ActionLink 以便我可以这样:
public abstract class AuthenticatedViewPageBase : WebViewPage
{
//...
public List<Permissions> ViewPermissions { get; set; }
//...
}
索引.cshtml:
@using PublicationSystem.Model.Enums
@model IEnumerable<PublicationSystem.Model.Profile>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_LayoutSmBanner.cshtml";
}
<p>
@Html.SecureActionLink("Create New", "Create") // checks the @permissions metadata
</p>
创建.cshtml:
@model PublicationSystem.Model.Profile
@ViewPermissions new List<Permissions> {Permissions.userCreate} // This would be the custom
// property or metadata field I define in the abstract class
@{
ViewBag.Title = "Create Profile";
Layout = "~/Views/Shared/_LayoutSmBanner.cshtml";
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
...
}
如果我能做到这一点,我的链接只需要询问目标视图需要哪些权限,而不必在每个链接周围包装 if 语句。
我可以向我的抽象 WebViewPage 类添加属性/属性来装饰我的示例中的视图吗?如果有怎么办?
自定义 ActionLink 是否可以“查看”目标 View 的元数据?
编辑:
我可能正在寻找这样的东西:
[Authorize(Permission="userCreate")]
public ActionResult Create()
{
//...
}
但我希望成为权限级别,而不是角色级别,并且我希望根据具有必要权限的用户启用我的链接隐藏/可见。
【问题讨论】:
标签: razor asp.net-mvc-5