Asp.net mvc 如何使视图在ASP.NET MVC中只显示特定用户的链接时不那么复杂

Asp.net mvc 如何使视图在ASP.NET MVC中只显示特定用户的链接时不那么复杂,asp.net-mvc,Asp.net Mvc,我有一个ASP.NET MVC视图,它需要一个链接,只有当它处于特定状态时,才能显示给特定的用户角色。我是这样写的: @if (!item.Validated && (HttpContext.Current.User.IsInRole("regionaladmin") || HttpContext.Current.User.IsInRole("superadmin")) { <input type="button" class="btnvalidate" value

我有一个ASP.NET MVC视图,它需要一个链接,只有当它处于特定状态时,才能显示给特定的用户角色。我是这样写的:

@if (!item.Validated && (HttpContext.Current.User.IsInRole("regionaladmin") || HttpContext.Current.User.IsInRole("superadmin")) {
    <input type="button" class="btnvalidate" value="Validate" data-invoiceid=@item.InvoiceId /> <span>|</span>
}
@if(!item.Validated&(HttpContext.Current.User.IsInRole(“区域管理员”)| HttpContext.Current.User.IsInRole(“超级管理员”)){
|
}
所以这有点乱了


有没有更好的解决方案可以稍微整理一下?

将“业务逻辑”重构为一个方法,并调用该方法:

@if (ShouldSeeInvalidateButton(item)) {
   // ...
}
你的职能是:

private bool ShouldSeeInvalidateButton(Item item)
{
    return !item.Validated && ....
}

将“业务逻辑”重构为单个方法,并调用该方法:

@if (ShouldSeeInvalidateButton(item)) {
   // ...
}
你的职能是:

private bool ShouldSeeInvalidateButton(Item item)
{
    return !item.Validated && ....
}

如果问题在于一次测试多个角色,则扩展方法可以帮助您:

public static bool IsInRole(this IPrincipal user, params string[] roles)
{
    return roles.Any(role => user.IsInRole(role));
}
从视图中,您还可以直接访问用户对象(无需浏览WebContext)。您的代码变成:

@if (!item.Validated && User.IsInRole("regionaladmin", "superadmin"))
{
    ...
}

如果问题在于一次测试多个角色,则扩展方法可以帮助您:

public static bool IsInRole(this IPrincipal user, params string[] roles)
{
    return roles.Any(role => user.IsInRole(role));
}
从视图中,您还可以直接访问用户对象(无需浏览WebContext)。您的代码变成:

@if (!item.Validated && User.IsInRole("regionaladmin", "superadmin"))
{
    ...
}

我也喜欢这种方法@Xavier@JohnWeldon如果逻辑需要应用于页面中的多个元素,那么您的方法会更好。我也喜欢这种方法@Xavier@JohnWeldon但是,如果需要将逻辑应用于页面中的多个元素,那么您的方法会更好。