Как показать разные разделы вида объектно-ориентированным способом - PullRequest
1 голос
/ 27 июня 2009

Я занимаюсь разработкой веб-сайта в ASP.NET MVC, где я хотел бы показать различные разделы представления для пользователей с разными уровнями безопасности. По сути, представления одинаковы, но пользователи с более высоким уровнем безопасности должны видеть разделы, которые не должны видеть пользователи с уровнями безопасности выше, например, администраторы.

Я не знаю, как сделать это объектно-ориентированным способом. Я думаю, что это можно сделать с помощью наследования, но я не знаю, как реализовать наследование в представлении.

Кроме того, я знаю, что могу кодировать множество ifs, делая что-то вроде

<% if (User has some security level) { %>
   <span>show this info</span>
<% } %>

но это плохо пахнет. Дело в том, что я не знаю, как использовать объектно-ориентированные принципы или дизайн для этой задачи.

Я думаю, что это обычная задача, поэтому я думаю, что есть решение для этой задачи. Например, Stackoverflow делает это, когда показывает некоторые параметры (редактировать, удалять и т. Д.) Для пользователя, который опубликовал вопрос (или ответ или комментарий), и скрывает эти параметры для всех остальных.

Ответы [ 4 ]

0 голосов
/ 29 июня 2009

Это не объектно-ориентированный подход, но он связан. Интересная часть этого вопроса заключается в том, как использовать операторы if. Обычный метод избавления от «если» или «дела» - это использование таблицы поиска критериев и эффектов. Существуют и другие методы, использующие эту же идею, такие как программирование, направленное на данные (http://en.wikipedia.org/wiki/Data-directed___programming) и таблицы диспетчеризации (http://en.wikipedia.org/wiki/Dispatch_table).). Многие реализации языка используют таблицы диспетчеризации типов для реализации вызовов виртуальных методов.

Предполагая, что частичные представления в порядке для этой проблемы, таблица поиска может быть списком пар. Первый элемент пары - это имя роли, которое проверяется по отношению к текущему пользователю. Вторым элементом пары является имя частичного представления, которое отображается при успешной проверке роли.

Мы инициализируем таблицу в контроллере (или везде) и назначаем ее ViewData, затем используем Html.RenderViewByRole, чтобы выбрать и отобразить правильный частичный вид:

<% Html.RenderPartialByRole(User, (List<Dispatch>)ViewData["rolePartial"]); %>

public static class MyHelper {
    public static void RenderPartialByRole(this HtmlHelper helper, IPrincipal user, List<Dispatch> rolePartial) {
        foreach (Dispatch d in rolePartial) {
            if (d.CheckRole(user)) {
                helper.RenderPartial(d.PartialName);
                break;
            }
        }
    }
}

public class Dispatch {
    string _roleName;
    string _partialName;

    public Dispatch(string roleName, string partialName) {
        _roleName = roleName;
        _partialName = partialName;
    }
    public bool CheckRole(IPrincipal user) {
        return user.IsInRole(_roleName);
    }
    public string PartialName {
        get { return _partialName; }
    }
}

public class HomeController : Controller {

    List<Dispatch> rolePartial = new List<Dispatch>();
    private void InitTable() {
        rolePartial.Add(new Dispatch("admin", "adminPartial"));
        rolePartial.Add(new Dispatch("report", "reportPartial"));
        rolePartial.Add(new Dispatch("guest", "guestPartial"));
    }

    public HomeController() {
        InitTable();
    }

    public ActionResult Index() {
        ViewData["rolePartial"] = rolePartial;
        return View();
    }
}
0 голосов
/ 27 июня 2009

Используя строго типизированное представление, присвойте вашей модели логическое свойство, например ShowSection (по одному для каждого раздела, логику для настройки в контроллере). Есть разделы в divtags с хорошими идентификаторами. Затем используйте JavaScript или jquery, чтобы установить стиль отображения тегов div на основе логического свойства.

0 голосов
/ 27 июня 2009

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

0 голосов
/ 27 июня 2009

В зависимости от сложности того, что вы делаете, маршрута оператора if может быть достаточно. Если нет, то вы можете посмотреть на использование частичных представлений и написать расширение HtmlHelper, которое позволит вам визуализировать частичное представление на основе определенной роли. Это может выглядеть примерно так:

<% Html.RenderPartialWithRole( "AdminSection",
                               Model,
                               ViewData,
                               User,
                               "Administrator",
                               null ) %>


public static void RenderPartialWithRole( this HtmlHelper helper,
                                          string partialName,
                                          object model,
                                          ViewDataDictionary viewData,
                                          IPrincipal user,
                                          string role,
                                          object htmlAttributes )
{
     if (user != null && !string.IsNullOrEmpty(role) && user.IsInRole(role))
     {
          helper.RenderPartial( partialName, model, viewData, htmlAttributes );
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...