2009-02-05 2 views
8

Я относительно новичок в MVC, так что это, скорее всего, новичок.Просмотр конкретных моделей в ASP.NET MVC?

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

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

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

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

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

ответ

2

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

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

<% if (Convert.ToBoolean(ViewData["AllowEdit"])) { %> 
<%= Html.ActionLink("Edit", "Edit", "Profile", 
        new { id = ViewData.Model.ID }, null) %> 
<% } %> 
1

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

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

0

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

public class BaseModel 
{ 
    Guid ActiveUserId; 
} 

public class EditModel : BaseModel 
{ 
    Guid AuthorUserId; 
} 

Затем, по вашему мнению, вы можете сделать основные сравнения:

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

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

3

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

Смежные вопросы