是否有可能将授权属性的结果移交给视图?
假设我想根据用户的成员资格在我的索引视图中隐藏5个链接。
[Authorize(Roles = "Admin")]
public ActionResult Index(){
....
}
上述代码将阻止所有不属于Admin-Group的用户访问Index页面。
@{
if(User.IsInRole("Admin"){
<a href="#">Some link to be hidden</a>
}
}
如果用户不属于Admin角色,则此代码将隐藏链接。这基本上就是我想要的但是如果角色会改变,我必须在每个隐藏的链接上更改角色名称。
是不是有两者兼而有之? (架构见下文)
[Authorize(Roles = "Admin")] //This will pass true to the View if the User is a member of the group "Admin"
public ActionResult Index(){
....
}
@{
if(User.IsAuthenticated){ //This will read the "Token" and if it's true the if statement will get executed.
<a href="#">Some link to be hidden</a>
}
}
所以 - 如果用户处于角色“管理员”中,则会显示该链接。这可能吗?
答案 0 :(得分:3)
您可以使用ViewBag
和ViewData
等其他内容,但我建议将模型传回视图,其中包含是否显示链接的属性。
public class YourViewModel()
{
public bool ShowHiddenLinks { get; set; }
// ... whatever other properties
}
然后在您的控制器中执行:
[Authorize(Roles = "Admin")]
public ActionResult Index()
{
var yourVm = new YourViewModel();
yourVm.ShowHiddenLinks = true;
return View(yourVm);
}
你的观点变成了:
@model YourViewModel
/* ShowHiddenLinks is true & this view is meant for admins only,
so show admin-related links */
@if (Model.ShowHiddenLinks)
{
<a href="#">Some link to be hidden</a>
}
我故意将viewmodel属性命名为ShowHiddenLinks
,因此它对于其他用户的视图也可以重复使用。您当然可以将viewmodel扩展为其他角色的功能属性(例如,管理员和管理员可以访问的视图,每个视图都有自己独立的隐藏链接集),或者每个角色创建一个viewmodel - 这一切都取决于场景。