Специфичные для просмотра модели в ASP.NET MVC? - PullRequest
8 голосов
/ 05 февраля 2009

Я относительно новичок в MVC, так что, скорее всего, это вопрос новичка.

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

Есть два сценария, которые я сейчас рассматриваю. Представьте себе очень простое приложение, которое позволяет пользователям просматривать и редактировать онлайн-профили для юристов. Существует действие / представление для отображения профиля конкретного пользователя и действие / представление для редактирования профиля конкретного пользователя. Легко представить хороший и чистый класс Model, представляющий детали профиля пользователя, возможно, созданный с помощью Entity Framework и сопоставленный с таблицей SQL профиля пользователя.

В действии вида / представлении для отображения профиля пользователя функционально мне нужна кнопка или ссылка, позволяющая пользователю редактировать профиль. Но это должно быть доступно только некоторому подмножеству пользователей. Например, пользователь может редактировать свой собственный профиль. Кроме того, супер пользователи могут редактировать любой профиль. Мой вопрос заключается в том, как View должен решить, должна ли быть ссылка при отображении определенного профиля. Я предполагаю, что это неправильно для представления, чтобы содержать логику, чтобы определить, может ли текущий пользователь редактировать текущий профиль. Должен ли я добавить свойство IsEditable в класс модели UserProfile? Это не кажется трагичным, но и не совсем правильным. Должен ли я создать новый класс Model, который объединяет UserProfile с дополнительной информацией о безопасности?

Другой сценарий ... При редактировании определенного профиля одна из вещей, которую можно редактировать, это список специальностей для конкретного юриста. Список возможных специальностей не фиксирован. Если представление хочет отобразить их в поле со списком, ему необходим список всех возможных специальностей из базы данных. Представление не должно получать их непосредственно из базы данных, поэтому я снова должен выполнить статистическую модель и снабдить представление как UserProfile, так и списком допустимых специальностей?

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

Ответы [ 4 ]

3 голосов
/ 21 августа 2010
Шаблон

ViewModel более конкретно ориентирован на сценарий, который вы описали. Вы можете использовать ViewData , но это менее рекомендуемое решение, поскольку вы теряете много преимуществ ASP.NET MVC framework. Например, когда вы используете ViewData , у вас нет поддержки типов безопасности, проверки во время компиляции и intellisense.

2 голосов
/ 05 февраля 2009

Для вашего сценария я передаю другой параметр в ViewData, ViewData ["AllowEdit"], который имеет значение true, если в представлении должна отображаться ссылка для редактирования. Я предпочитаю это клонировать модель в модель для конкретного вида, чтобы добавить этот единственный атрибут. Я иногда создаю определенные модели представления - например, у меня есть Grid ViewUserControl, который берет модель Grid, которую я могу создать из любого списка других классов моделей - но я бы не стал в этом случае.

На мой взгляд, я бы сделал что-то вроде этого:

<% if (Convert.ToBoolean(ViewData["AllowEdit"])) { %>
<%= Html.ActionLink("Edit", "Edit", "Profile",
                    new { id = ViewData.Model.ID }, null ) %>
<% } %>
1 голос
/ 05 февраля 2009

Для вашей первой ситуации я, вероятно, попытался бы инкапсулировать логику для этого в модели профиля, возможно, с помощью функции, подобной CanEdit (), которая принимает параметры информации о пользователе и проверяет, является ли пользователь владельцем профиля или если иметь права суперпользователя. Затем в контроллере я бы вызвал функцию и передал результаты в представление, используя ViewData.

Во-вторых, в действии контроллера редактирования профиля найдите список специальностей (через модель) и передайте его представлению, используя ViewData.

0 голосов
/ 05 февраля 2009

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

public class BaseModel
{
    Guid ActiveUserId;
}

public class EditModel : BaseModel
{
    Guid AuthorUserId;
}

Затем, на ваш взгляд, вы можете сделать базовое сравнение:

<% if (Model.ActiveUserId == AuthorUserId)
    Response.Write (Html.ActionLink (.....)) %>

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

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