每个菜单链接都有三种类型的角色。
当结算人登录网站时
如何动态确定内容区域中显示的partial.html文件?
我无法将内容硬编码到菜单中的第一个actionlink,这意味着最初会加载管理。
在这种情况下我该怎么办?
答案 0 :(得分:4)
这些类型的决策最好在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.
}
}
答案 1 :(得分:2)
我可以想到几种方法来做到这一点。
如果您需要所有用户获得相同的网址/操作,那么您可以执行类似这样的操作
public ActionResult Custom(RoleEnum userRole)
{
switch(userRole)
{
case RoleEnum.Admin:
.....
return Partial("_adminPartial", viewModel);
// rest of you cases here
}
}
OR:
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 。希望这可以帮助你
答案 2 :(得分:0)
嗯,你还没有提供足够的信息给出任何明确的指示,但一般来说,你应该改变你的登录后动作,重定向到一个不同的地方,取决于一些识别因素,如角色(以下是伪代码)< / p>
// do login
if (user is "Billing")
{
// redirect to billing action
}
// etc.
您应该切换部分或视图的唯一原因是您正在执行SPA(单页面应用程序)并使用JavaScript进行路由。在这种情况下,您只需要一些可以用AJAX命中的端点来获得用户的角色&#34;。
但是,我并不认为这是你实际做的事情。如果您只是直接使用MVC,那么您应该实际更改URL,而不仅仅是加载不同的Razor视图。