c# - 有没有比在 mvc razor View 中使用 if 语句显示带有角色的 html 代码更好的方法

标签 c# asp.net-mvc asp.net-mvc-4 razor asp.net-mvc-5

目前我的 C# 成员角色代码结构如下

@if (WebApiApplication.CurrentUser.CurrentRole == Role.SysAdmin || WebApiApplication.CurrentUser.CurrentRole == Role.Coordinator)
{
   <li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li>
   <li id="InternsMenu" class="@Model.GetMenuClass("InternsMenu")"><a href="@Url.Action("Index", "Interns")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li>
   <li id="ProjectsMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Index", "Projects")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li>
   <li id="AssignmentsMenu" class="@Model.GetMenuClass("AssignmentsMenu")"><a href="@Url.Action("Index", "Assignments")"><i class="fa fa-paperclip"></i>&nbsp;&nbsp;Assignments</a></li>
}
@if (WebApiApplication.CurrentUser.CurrentRole == Role.User )
{
   <li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li>
   <li id="InternsMenu" class="@Model.GetMenuClass("InternsMenu")"><a href="@Url.Action("Index", "Interns")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li>
   <li id="ProjectsMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Index", "Projects")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li>
   <li id="AssignmentsMenu" class="@Model.GetMenuClass("AssignmentsMenu")"><a href="@Url.Action("Index", "Assignments")"><i class="fa fa-paperclip"></i>&nbsp;&nbsp;Assignments</a></li>
}

@if (WebApiApplication.CurrentUser.CurrentRole == Role.Intern)
{
    <li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li>
    <li id="TimecardMenu" class="@Model.GetMenuClass("TimecardMenu")"><a href="@Url.Action("Timecard", "Assigments")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li>
    <li id="FeedbackMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Feedback", "Assigments")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li>
    <li id="SupportMenu" class="@Model.GetMenuClass("SupportMenu")"><a href="@Url.Action("Index", "Support")"><i class="fa fa-question-circle"></i>&nbsp;&nbsp;Support</a></li>
}

什么是处理 Roles 逻辑而不是 Razor View 的更好方法?在 C# 模型中执行?

最佳答案

我认为在 View 中处理这样的事情是可以的,因为它处理页面中菜单项的显示。

正如上面评论中提到的其他人一样,最好在 View 模型中定义映射到用户角色的属性并使用它。

您可以改用 switch 语句并将适用于不同角色的选项分组。例如,我确实在您的示例中注意到角色 SysAdmin、Coordinator 和 User 都具有相同的菜单项,所有角色都可以访问主菜单,只有角色 Intern 应该看到 TimeCard、反馈和支持菜单。

请看下面的例子:

<li id="HomeMenu" class="@Model.GetMenuClass("HomeMenu")"><a href="@Url.Action("Index", "Home")"><i class="fa fa-home"></i>&nbsp;&nbsp;Home</a></li>

    @switch (WebApiApplication.CurrentUser.CurrentRole)
        {
          case Role.SysAdmin:
          case Role.Coordinator:
          case Role.User:
            <li id="InternsMenu" class="@Model.GetMenuClass("InternsMenu")"><a href="@Url.Action("Index", "Interns")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li>
            <li id="ProjectsMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Index", "Projects")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li>
            <li id="AssignmentsMenu" class="@Model.GetMenuClass("AssignmentsMenu")"><a href="@Url.Action("Index", "Assignments")"><i class="fa fa-paperclip"></i>&nbsp;&nbsp;Assignments</a></li>
            break;
          case Role.Intern:
            <li id="TimecardMenu" class="@Model.GetMenuClass("TimecardMenu")"><a href="@Url.Action("Timecard", "Assigments")"><i class="fa fa-user"></i>&nbsp;&nbsp;Interns</a></li>
            <li id="FeedbackMenu" class="@Model.GetMenuClass("ProjectsMenu")"><a href="@Url.Action("Feedback", "Assigments")"><i class="fa fa-list-alt"></i>&nbsp;&nbsp;Projects</a></li>
            <li id="SupportMenu" class="@Model.GetMenuClass("SupportMenu")"><a href="@Url.Action("Index", "Support")"><i class="fa fa-question-circle"></i>&nbsp;&nbsp;Support</a></li>
            break;
      }

关于c# - 有没有比在 mvc razor View 中使用 if 语句显示带有角色的 html 代码更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38257561/

相关文章:

visual-studio - &lt;script&gt; 中的 Razor @if 被 VS11 拒绝

c# - 为什么VS2017在watch View 中查看基类对象时显示的是派生类的成员值?

c# - 为什么.NET 的 Version 是类而不是结构?

asp.net - Autofac 无法从 asp.net 5 中的程序集扫描中解析类型

jquery - 可以在 asp.net mvc4 中使用 jquery 在 @html.label 中设置值吗?

html - 输入字段设置为 'Value=' 而不是 'value='

c# - ASP.NET MVC BeginCollectionItem 问题

c# - 如何在 Repeater 中设置 DropDownList 选定值?

c# - 由于 Null 异常,.net core docker 容器在生产中退出并出现错误代码 139

c# - 仍然需要没有 Required 属性的整数属性