Как сохранить взгляды без логики авторизации в mvc? - PullRequest
5 голосов
/ 27 апреля 2010

У меня есть вид, чтобы отобразить список элементов. Пользователь может редактировать, удалять или создавать новые элементы, но в соответствии с их разрешениями ему может быть разрешено или не разрешено выполнять некоторые из этих действий.

У меня есть требование отображать только те действия, которые разрешено выполнять текущему пользователю, но я не хочу загромождать представления авторизацией if-else

Несмотря на то, что это очень распространенное требование, я не могу найти действительно удовлетворительный способ выполнить его.

Мой лучший подход до сих пор состоит в том, чтобы обеспечить перегрузку для метода расширения Html.ActionLink, который требует разрешения для запроса, но будут более сложные сценарии, такие как скрытие целых блоков html или переключение текстового поля для этикетка + скрытая.

Есть ли лучший способ сделать это?

Ответы [ 5 ]

2 голосов
/ 27 апреля 2010

Один из примеров, который я могу придумать, - это вызвать Html.RenderAction (ссылка: http://msdn.microsoft.com/en-us/library/ee703490.aspx),) и затем передать ссылку, которую вы хотите использовать в качестве значения маршрута, в метод действия (она появится в качестве параметра вваше действие). Поскольку это RenderAction, вы можете вернуться к процессу контроллера и, таким образом, можете сделать так, чтобы он отображал любое представление или данные в зависимости от состояния пользователя.

Пример:

<% Html.RenderAction("Permissions" /* Controller */, "PermissionLink", new { Url = "Admin.aspx" }); %>

И ваш контроллер будет иметь что-то вроде:

public ActionResult PermissionsLink (string url)
{
     // Do Whatever kind of Authentication you want here, Session is available, etc

     if(authenticated)
        return View("Link");
     else
        return View("Blank");
}
0 голосов
/ 09 марта 2012

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

Мой подход был бы таким:

  • Заставьте контроллер выполнять фактическую логику определения уровня доступа, который имеет пользователь
  • Передача этой информации в представление с использованием (т. Е. Через ViewModel), но способом, который нейтрален к деталям реализации (например, «пользователь является администратором», «пользователь является автором» и т. Д.)
  • Пусть представление отрисовывается надлежащим образом, используя только предварительно скомпилированные данные, предоставленные контроллером.

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

0 голосов
/ 14 марта 2011

В сложных ситуациях, когда много условий и правил, я делаю так:

ViewModel

public class ModelView
{
    private IAuthorisationService { get; set; }

    public bool CanShow
    {
        ...
    }
}

Вид:

<% if(Model.CanShow) { %>
    <html>
<% } %>
0 голосов
/ 19 мая 2010

Не проще ли создать несколько представлений с различными элементами управления на основе значений, которые пользователь может изменить, а затем вернуть правильное представление на основе прав доступа пользователя?

Представления должны быть только для представления информации, на самом деле в них не должно содержаться никакой условной логики или, по крайней мере, минимум.

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

К тому моменту, когда View будет выполнять свою работу, все важные «решения» уже должны быть приняты.

0 голосов
/ 27 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...