C# 使用asp.net mvc为不同的用户类型提供不同的启动布局

C# 使用asp.net mvc为不同的用户类型提供不同的启动布局,c#,asp.net-mvc,asp.net-mvc-5.2,C#,Asp.net Mvc,Asp.net Mvc 5.2,对于每个菜单链接,我有三种类型的角色 当计费员登录到该站点时 如何动态确定内容区域中显示的partial.html文件 我无法将内容硬编码到菜单中的第一个actionlink,这意味着总是在最初加载管理 在这种情况下我能做什么 这些类型的决策最好在控制器中做出 例如: public HomeController: Controller { public ActionResult Administration() { // Determine the user's

对于每个菜单链接,我有三种类型的角色

当计费员登录到该站点时

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

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

在这种情况下我能做什么


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

例如:

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

好吧,您还没有提供足够的信息来给出明确的方向,但是一般来说,您应该根据一些识别因素(如角色)更改登录后操作以重定向到不同的位置(以下是伪代码)

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


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

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

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

public ActionResult Custom(RoleEnum userRole)
{
    switch(userRole)
    {
        case RoleEnum.Admin:
        .....
        return Partial("_adminPartial", viewModel);

       // rest of you cases here
    }
}
或:

另一种方法是,我建议为每个需要不同布局的用户创建一个
MVC区域
,然后在登录时,您可以将他们重定向到适当的
区域
,我建议这样做,因为它允许用户界面层中的角色之间进行更深入的区分

实现不同布局的另一种方法(我说的是与ASP.Net母版页类似的
MVC布局页
)是使用
ViewBag
或任何其他您喜欢的方法将
字符串布局
传递给视图,然后在
Razor
代码中执行以下操作:

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

我把这最后一个留给了最后一个,因为它对我来说有点粗糙。希望这能帮助您在MVC控制器中说
return Partial(x,viewModel)
x
部分是一个字符串,因此您可以请求
userRole
参数,然后有条件地获得部分名称,否则,您可以为每个角色创建一个
区域
,然后一旦用户登录,您就可以将其重定向到适当的位置area@Luiso听起来像是一个你应该添加的“答案”,这样你就可以获得一些投票权…@ganders刚刚发布了我的答案,谢谢。我需要根据用户角色隐藏其他链接。
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);
}
 @model MyViewModel
 @{
      Layout = (string)ViewBag.Layout;
 }