在asp.net mvc的masterpage上有条件地渲染部分

Rip*_*ppo 3 c# asp.net-mvc master-pages renderpartial

嗨,我在asp.net mvc Web应用程序的主页上定义了以下菜单

<%Html.RenderPartial("AdminMenu"); %>
<%Html.RenderPartial("ApproverMenu"); %>
<%Html.RenderPartial("EditorMenu"); %>
Run Code Online (Sandbox Code Playgroud)

但是,我想只显示正确的菜单,具体取决于登录的用户角色.我该如何实现这一目标?

我开始认为我的策略是不正确的,那么是否有更好的方法来实现同样的目标?

Jos*_*eph 8

举个简单的例子,你可以这样做:

<% 
    if (User.IsInRole("AdminRole")
        Html.RenderPartial("AdminMenu"); 
    else if (User.IsInRole("Approver")
        Html.RenderPartial("ApproverMenu"); 
    else if (User.IsInRole("Editor")
        Html.RenderPartial("EditorMenu"); 
%>
Run Code Online (Sandbox Code Playgroud)

或者您的用户可能处于多个角色,在这种情况下,类似这样的逻辑可能更合适:

<% 
    if (User.IsInRole("AdminRole")
        Html.RenderPartial("AdminMenu"); 
    if (User.IsInRole("Approver")
        Html.RenderPartial("ApproverMenu"); 
    if (User.IsInRole("Editor")
        Html.RenderPartial("EditorMenu"); 
%>
Run Code Online (Sandbox Code Playgroud)

或者使用扩展方法为后者提供更优雅的方法:

<% 
    Html.RenderPartialIfInRole("AdminMenu", "AdminRole"); 
    Html.RenderPartialIfInRole("ApproverMenu", "Approver"); 
    Html.RenderPartialIfInRole("EditorMenu", "Editor"); 
%>
Run Code Online (Sandbox Code Playgroud)

public static void RenderPartialIfInRole
    (this HtmlHelper html, string control, string role)
{
    if (HttpContext.Current.User.IsInRole(role)
        html.RenderPartial(control);
}
Run Code Online (Sandbox Code Playgroud)