Как обрабатывать ролевые представления в MVC? - PullRequest
1 голос
/ 14 августа 2010

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

Например (псевдокод):

views / post / show:

<% show post here %>
if (role.isAdmin or role.isModerator) {
   <% show moderation tools %>
}
<% show rest of content %>

Мне не очень нравится идея помещать слишком много бизнес-логики в представление, но, похоже, нет других вариантов.Здесь?

Это становится все более и более запутанным, когда у вас есть больше ролей или разные уровни разрешений.Возьмите этот сайт для примера.Пользователи с более чем 200 повторениями видят меньше рекламы.Пользователи с более чем 500 повторениями имеют кнопку «retag».Затем вы получаете кнопку редактирования на 2000, кнопку закрытия на 3000, инструменты модерации на 10k и другие функции, если вы «звездный» модератор.

Ответы [ 4 ]

4 голосов
/ 14 августа 2010

Вы можете сделать это немного лучше, если у вас есть пользовательская ViewModel с логическим свойством с именем ShowModerationTools.В вашем контроллере вы выполняете проверки, чтобы увидеть, может ли текущий пользователь, основываясь на его ролях, увидеть сообщение и установить ShowModerationTools либо true, либо false.Затем вы возвращаете пользовательскую модель представления в представление.Таким образом, вы можете просто сделать это в своем представлении:

<% show post here %>
if (Model.ShowModerationTools) {
   <% show moderation tools %>
}
<% show rest of content %>

Это также означает, что если ваши бизнес-правила изменяются (например, вам нужно ввести другое условие), вы просто меняете контроллер и не должныизмени свой взгляд.

3 голосов
/ 14 августа 2010

В этом нет ничего плохого.Это не бизнес логика.Это логика представления.

Вопрос, на который if отвечает на этот вопрос: должны ли мы показать инструменты модерации?
Это не так: «должен ли обычный пользователь иметь возможность удалить всю историю платежей» или что-то в этом роде.

1 голос
/ 14 августа 2010

Я согласен с Арнисом Л. - но добавлю следующее.

Вы могли бы сделать это вместо ...

<% show post here %>
<% Html.RenderAction<MyControllerName>(m => m.ModerationTools()); %>
<% show rest of content %>

Это имеет несколько преимуществ.

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

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

  3. Может использоваться повторно на других страницах.

0 голосов
/ 14 августа 2010

Лично я думаю, что здесь важнее разница между хорошим и достаточно хорошим ...

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

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

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