Как использовать несколько Layout в MVC 3? - PullRequest
3 голосов
/ 05 марта 2012

У меня есть четыре типа пользователей (клиент, администратор, менеджер, учитель), которые могут использовать мой будущий веб-сайт ASP ... И поэтому для каждого из них мне нужно создать разные интерфейсы ...

И вот мои вопросы:

  • Правильно ли использовать другой макет в MVC 3? Если нет, что я могу использовать для моей проблемы?

  • Если это правильно, как использовать другой макет в MVC 3? Можете ли вы привести один или несколько примеров, пожалуйста?

Ответы [ 4 ]

8 голосов
/ 05 марта 2012

Я бы создал разные страницы _Layout.cshtml для каждой категории пользователей и поместил логику выбора _Layout в страницу _ViewStart.cshtml.

[Поскольку _ViewStart.cshtml позволяет нам писать код, мы можем при желании сделать нашу логику выбора Layout более богатой, чем просто базовый набор свойств.]

http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx

1 голос
/ 05 марта 2012

Я использую 2 макета в своих приложениях - Master (для всех пользователей) и Admin (для команды администраторов). Разница лишь в украшениях - у администратора нет баннеров, логотипов и т. Д. Таким образом, это зависит от вас, чтобы использовать несколько. Но я бы остался с одним для клиента, менеджера и учителя. Используйте различные CCS-файлы для них, чтобы сделать внешний вид уникальным

1 голос
/ 05 марта 2012

Вы можете показать страницы по-разному, проверив, какой пользователь это

В моем _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>
                    }

И так далее.

Вы можете создавать различные DisplayTemplates для каждого типа роли и отображать их в зависимости от роли, которую имеет пользователь.

Чтобы вручную назначить роли различным пользователям, используйте конфигурацию ASP.NET

ASP.NET Configuration

Оттуда вы можете создавать свои роли и управлять пользователями.

Вы не хотите делать это в долгосрочной перспективе, если на вашем сайте много пользователей.Вместо этого, когда они создают учетную запись, вы хотите назначить их роль автоматически.

Вы можете сделать это в вашем AccountController, например, так:

if (createStatus == MembershipCreateStatus.Success)
                {
                    Roles.AddUserToRole(model.UserName, "Respondent");
} ....

Ваша модель может иметьСвойство роли вместо его жесткого кодирования.

0 голосов
/ 17 марта 2016

Я нашел этот ответ здорово.В добавление к этому, если вы хотите использовать другой макет в зависимости от имени контроллера, попробуйте изменить способ, как показано ниже:

 public static string LayoutHelper(RouteData data, string defaultLayout = "")
    {
        if (data.Values["controller"].ToString() == "client")
            return "~/views/shared/_Layout2.cshtml";
        return defaultLayout;
    }

Представление индекса Client Controller

@{
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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...