我如何控制 user/admin 在视图中没有逻辑的情况下可以看到的内容? MVC 5
How can I control what an user/admin can see without logic in views? MVC5
我想简要介绍一下我的应用程序的外观。
如果您没有登录,您看到的是主页和 Products/Users/Discounts 等链接,但是当您尝试访问这些链接时,您将被强制登录。
以用户身份登录后,您可以再次看到所有链接,但您只能访问产品和折扣。
如果您以管理员身份登录,则可以访问任何内容。
根据您的角色,我应该使用什么来隐藏这些链接? (unregistered/user/admin)
我不想在视图中使用逻辑。
为了限制访问,我使用了一个属性,并将当前的 UserViewModel 传递给 Session,它具有 属性 的角色。
谢谢!
您可以动态地制作菜单,根据用户的配置文件传递值。
创建一个 HTML.Helper 以遍历此项目并在您的视图中呈现。
public static MvcHtmlString SideBarItens(this HtmlHelper helper, IDictionary<string, string> model)
{
var stringBuilder = new StringBuilder();
foreach (var item in model)
stringBuilder.Append(string.Format("<li><a href=\"/{0}\">{1}</a></li>", item.Key, item.Value));
return MvcHtmlString.Create(stringBuilder.ToString());
}
为此Menu创建一个Action,带有[ChildActionOnly]
属性,此Action的职责是获取用户的资料,并根据该资料获取该资料的菜单项,并通过这对您的局部视图很重要。您可以创建一个字典来传递操作友好的名称以在 HTML 中呈现,并为该操作的路由赋值。例如:new Dictionary{{"New Products", "Products/New"}}
在您的 _Layout 或您拥有的任何默认共享视图中,您调用 ChildAction。
<div class="container-fluid" style="margin-top: 50px;">
<div class="row">
@Html.Action("Menu", "Base")
<div class="col-sm-9 col-md-10 main">
<ol class="breadcrumb" style="margin-top: 20px">
<li><a href="/Home">Home</a></li>
</ol>
@RenderBody()
</div>
</div>
你为此采取的行动
[HttpGet, ChildActionOnly]
public ActionResult Menu()
{
//Your logic to fill Dictionary and then returns
return PartialView(dictionary)
}
最后,您为菜单创建一个视图,它接收您的字典作为模型并调用您的助手。
@model IDictionary<string, string>
<li>
<ul class="nav-sidebar">
@Html.SideBarItens(Model)
</ul>
</li>
PS: 我建议你缓存你的菜单操作
我想简要介绍一下我的应用程序的外观。 如果您没有登录,您看到的是主页和 Products/Users/Discounts 等链接,但是当您尝试访问这些链接时,您将被强制登录。
以用户身份登录后,您可以再次看到所有链接,但您只能访问产品和折扣。 如果您以管理员身份登录,则可以访问任何内容。 根据您的角色,我应该使用什么来隐藏这些链接? (unregistered/user/admin)
我不想在视图中使用逻辑。
为了限制访问,我使用了一个属性,并将当前的 UserViewModel 传递给 Session,它具有 属性 的角色。
谢谢!
您可以动态地制作菜单,根据用户的配置文件传递值。
创建一个 HTML.Helper 以遍历此项目并在您的视图中呈现。
public static MvcHtmlString SideBarItens(this HtmlHelper helper, IDictionary<string, string> model) { var stringBuilder = new StringBuilder(); foreach (var item in model) stringBuilder.Append(string.Format("<li><a href=\"/{0}\">{1}</a></li>", item.Key, item.Value)); return MvcHtmlString.Create(stringBuilder.ToString()); }
为此Menu创建一个Action,带有
[ChildActionOnly]
属性,此Action的职责是获取用户的资料,并根据该资料获取该资料的菜单项,并通过这对您的局部视图很重要。您可以创建一个字典来传递操作友好的名称以在 HTML 中呈现,并为该操作的路由赋值。例如:new Dictionary{{"New Products", "Products/New"}}
在您的 _Layout 或您拥有的任何默认共享视图中,您调用 ChildAction。
<div class="container-fluid" style="margin-top: 50px;"> <div class="row"> @Html.Action("Menu", "Base") <div class="col-sm-9 col-md-10 main"> <ol class="breadcrumb" style="margin-top: 20px"> <li><a href="/Home">Home</a></li> </ol> @RenderBody() </div> </div>
你为此采取的行动
[HttpGet, ChildActionOnly] public ActionResult Menu() { //Your logic to fill Dictionary and then returns return PartialView(dictionary) }
最后,您为菜单创建一个视图,它接收您的字典作为模型并调用您的助手。
@model IDictionary<string, string> <li> <ul class="nav-sidebar"> @Html.SideBarItens(Model) </ul> </li>
PS: 我建议你缓存你的菜单操作