【问题标题】:Different start layouts for different user types with asp.net mvc使用 asp.net mvc 针对不同用户类型的不同启动布局
【发布时间】:2015-10-30 00:14:00
【问题描述】:

我为每个菜单链接设置了三种类型的角色。

当结算员登录网站时

如何动态确定内容区域中显示的 partial.html 文件?

我无法将内容硬编码到菜单中的第一个操作链接,这意味着最初总是加载管理。

在这种情况下我该怎么办?

【问题讨论】:

  • 在 MVC 控制器中,当您说 return Partial(x, viewModel) 时,x 部分是一个字符串,因此您可以请求一个 userRole 参数,然后您可以有条件地获取部分名称,否则您可以为每个角色创建一个Area,然后一旦用户登录,您就可以将其重定向到正确的区域
  • @Luiso 听起来像是您应该添加的“答案”,这样您就可以获得一些支持...
  • @ganders 刚刚发布了我的答案,谢谢

标签: c# asp.net-mvc asp.net-mvc-5.2


【解决方案1】:

这些类型的决定最好在 Controller 中做出。

例子:

public HomeController: Controller
{
    public ActionResult Administration()
    {
        // Determine the user's role. 
        // "GetRole()" does not really exist on the controller - use your own method.
        string role = GetRole();
        if (role == "Billing Guy")
            return View("AdministrationBillingGuy")
        else if (role == "SalesGuy")
            return View("AdministrationSalesGuy")
        else
            return View();
        // etc.
    }
}

【讨论】:

    【解决方案2】:

    我可以想出几种方法来做到这一点。

    如果您需要所有用户获得相同的 url/action,那么您可以这样做

    public ActionResult Custom(RoleEnum userRole)
    {
        switch(userRole)
        {
            case RoleEnum.Admin:
            .....
            return Partial("_adminPartial", viewModel);
    
           // rest of you cases here
        }
    }
    

    或者:

    public ActionResult Custom(RoleEnum userRole)
    {
        var view = GetViewByRole(userRole);
        // where GetViewByRole takes the enum and 
        // returns a string with the name of the partial
    
        return Partial(view, viewModel);
    }
    

    另一种方法是,我推荐的一种方法是为每个需要不同布局的用户创建一个MVC Area,然后在登录时您可以将它们重定向到正确的Area,我推荐它,因为它允许在 UI 层中更深入地区分角色。

    实现不同布局的另一种方法(我说的是MVC Layout Pages,类似于ASP.Net Master pages)是将string Layout 传递给视图,使用ViewBag 或您喜欢的任何其他方法,然后在@ 987654329@ 代码你可以这样做:

     @model MyViewModel
     @{
          Layout = (string)ViewBag.Layout;
     }
    

    我把最后一个留到最后,因为它对我来说有点hacky。希望对你有帮助

    【讨论】:

      【解决方案3】:

      好吧,您没有提供足够的信息来给出任何明确的指示,但通常,您应该根据角色等一些识别因素(以下是伪代码)更改您的登录帖子操作以重定向到不同的位置

      // do login
      
      if (user is "Billing")
      {
          // redirect to billing action
      }
      
      // etc.
      

      您应该切换部分或视图的唯一原因是如果您正在执行 SPA(单页应用程序)并使用 JavaScript 进行路由。在这种情况下,您只需要一些可以使用 AJAX 访问的端点来获取用户的“角色”。

      但是,我认为这不是您实际在做的事情。如果您只是直接使用 MVC,那么您实际上应该更改 URL,而不仅仅是加载不同的 Razor 视图。

      【讨论】:

      • 我需要根据用户角色隐藏其他链接。
      猜你喜欢
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多