Значения Html.Dropdownlist при использовании классов репозитория - PullRequest
1 голос
/ 23 января 2011

До сих пор я использовал класс Model для встраивания списка связанных значений для отображения в виде DropDownList.Например, предположим, что у меня есть класс модели Contact, в котором есть свойство ContactType

public class Contact {
    ...
    public int ContactTypeID { get; set; }
    ...
}

ContactTypeID ссылается на строку в таблице базы данных, которая содержит все типы контактов, такие как Customer, Supplier и т. Д. Я использовалДо сих пор успешно, свойство класса Contact называлось, например, ContactTypeList, как в следующем примере

public IEnumerable<SelectListItem> ContactTypeList {
    get {
        return GetContactTypeList().Select(
            t => new SelectListItem { Text = t.Description, 
                 Value = t.ContactTypeID.ToString() });
    }
}

Таким образом, при использовании строгих типизированных представлений я могу сделать следующее

<%: Html.DropDownListFor( model => model.ContactTypeID, Model.ContactTypeList, new {} )%>

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

В новом проекте, который я начинаю, я использую шаблон репозитория и StructureMap в качестве инструмента DI / IoC, и поэтому класс модели больше не имеет ссылки на класс репозитория, который получает данные избазовое хранилище данных.

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

Как дела в ваших проектах?Каков наилучший способ достижения результата и сохранения чистоты кода?

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 23 января 2011

В своих проектах я использую модели представлений и контроллер для управления моделью:

Модель:

public class ContactViewModel
{
    public int ContactTypeID { get; set; }
    public IEnumerable<SelectListItem> ContactTypeList { get; set; }
}

Контроллер:

public class ContactsController
{
    private readonly IContactsRepository _repository;
    public ContactsController(IContactsRepository repository)
    {
        _repository = repository;
    }

    [AutoMap(typeof(Contact), typeof(ContactViewModel))]
    public ActionResult Index()
    {
        var model = _repository.GetContacts();
        return View(model);
    }
}

Используемый атрибут AutoMap содержит фильтр действий, который будет выполняться после действия контроллера, и он будет использовать AutoMapper для замены модели, переданной в представление (контакт), на соответствующую модель представления (ContactViewModel). Вы можете увидеть это в действии в образце структуры проекта , который я написал.

Теперь, очевидно, если вы собираетесь показывать этот выпадающий список контактов по всему проекту, он заслуживает отдельного контроллера и дочернего действия, которое будет повторно использоваться в вашем представлении с помощью Html.Action helper .

1 голос
/ 23 января 2011

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

...