asp.net mvc 针对不同用户类型的不同启动布局

Different start layouts for different user types with asp.net mvc

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

计费人员登录网站时

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

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

遇到这种情况怎么办?

这些类型的决策最好在控制器中做出。

示例:

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.
    }
}

好吧,您没有提供足够的信息来提供任何明确的方向,但一般来说,您应该只更改登录 post 操作以根据某些识别因素(例如角色)重定向到不同的地方是伪代码)

// do login

if (user is "Billing")
{
    // redirect to billing action
}

// etc.

您应该关闭局部视图或视图的唯一原因是您正在执行 SPA(单页应用程序)并利用 JavaScript 进行路由。在这种情况下,您只需要一些可以用 AJAX 命中的端点来获取用户的 "role".

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

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

如果您需要所有用户获得相同的 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 或你喜欢的任何其他方法,然后在 Razor 代码中你可以这样做:

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

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