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。希望对您有所帮助
我为每个菜单链接设置了三种类型的角色。
计费人员登录网站时
如何动态确定内容区域中显示的 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。希望对您有所帮助