【发布时间】:2012-03-05 10:18:47
【问题描述】:
我有四种用户(客户、管理员、经理、教师)可以使用我未来的 ASP 网站...因此我必须为他们中的每一个创建不同的界面...
所以我的问题:
在 MVC 3 中使用不同的布局是否正确?如果不是,我可以用什么来解决我的问题?
如果正确,如何在 MVC 3 中使用不同的布局?请给我一个或多个例子吗?
【问题讨论】:
标签: c# asp.net-mvc-3
我有四种用户(客户、管理员、经理、教师)可以使用我未来的 ASP 网站...因此我必须为他们中的每一个创建不同的界面...
所以我的问题:
在 MVC 3 中使用不同的布局是否正确?如果不是,我可以用什么来解决我的问题?
如果正确,如何在 MVC 3 中使用不同的布局?请给我一个或多个例子吗?
【问题讨论】:
标签: c# asp.net-mvc-3
我会为每个用户类别创建不同的 _Layout.cshtml 页面,并将 _Layout 选择逻辑放在 _ViewStart.cshtml 页面中。
[因为 _ViewStart.cshtml 允许我们编写代码,我们可以选择性地使我们的布局选择逻辑更丰富,而不仅仅是一个基本的属性集。]
http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx
【讨论】:
您可以通过测试用户类型以不同方式显示页面
在我的 _Layout.cshtml 我有这个:
@if (Request.IsAuthenticated && HttpContext.Current.User.IsInRole("Interviewer"))
{
<script type="text/javascript">
$("#logindisplay").show();
</script>
<li>@Html.ActionLink("Forside", "Index", "Home")</li>
<li>@Html.ActionLink("Spørgeskema", "Index", "Survey2")</li>
<li>@Html.ActionLink("Brugere", "Index", "UserAdministration")</li>
<li>@Html.ActionLink("Statistik", "Index", "Statistik")</li>
<li>@Html.ActionLink("Vagtplan", "Vagtplan", "Statistik")</li>
}
@if (HttpContext.Current.User.IsInRole("Respondent"))
{
<li>@Html.ActionLink("Gammelt spørgeskema", "Index")</li>
}
等等。
您可以为每种角色创建不同的 DisplayTemplate,并根据用户的角色显示这些模板。
要手动将角色分配给不同的用户,请使用 ASP.NET 配置
从那里,您可以创建角色和管理用户。
如果您的网站上有很多用户,从长远来看,您不希望这样做。相反,当他们创建帐户时,您会希望自动分配他们的角色。
您可以在 AccountController 中执行此操作,例如:
if (createStatus == MembershipCreateStatus.Success)
{
Roles.AddUserToRole(model.UserName, "Respondent");
} ....
您的模型可以具有 Role 属性,而不是对其进行硬编码。
【讨论】:
我在我的应用程序中使用 2 个布局 - 主(适用于所有用户)和管理员(适用于管理团队)。唯一的区别在于装饰 - 管理员没有横幅、徽标等...... 因此,您可以使用几个。但我会为客户、经理和老师留下一个。为它们使用不同的 CCS 文件以使外观独一无二
【讨论】:
我发现this answer 很棒。添加到它,如果您想根据控制器名称使用不同的布局,请尝试如下编辑方法:
public static string LayoutHelper(RouteData data, string defaultLayout = "")
{
if (data.Values["controller"].ToString() == "client")
return "~/views/shared/_Layout2.cshtml";
return defaultLayout;
}
客户端控制器索引视图
@{
Layout = HtmlHelper.LayoutHelper(Request.RequestContext.RouteData, "~/views/shared/_layout1.cshtml");
ViewBag.Title = "Clients";} <h2>This is my view</h2>
最后是新的 Layout2.cshtml
<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /><title>@ViewBag.Title</title></head><body> This is my Layout2 <div> RenderBody()</div></body></html>
【讨论】: