Где должна находиться логика выбора в ASP.NET MVC, представлении, модели или контроллере? - PullRequest
4 голосов
/ 19 сентября 2010

Я чувствую, что мой вопрос близок к этому, но я хочу более общее обсуждение того, где должен находиться код, подобный этому. Вопрос рефакторинга Asp.Net MVC SelectList?

В настоящее время я создаю свои списки выбора непосредственно на моей модели сущности, вот так.

public SelectList taskDeadlineTime
    {
        get { return new SelectList(TimeDictionary, "Value", "Key", this.getDeadlineTime()); }
    }

Это выглядит немного неправильно, как будто я выполняю работу по просмотру внутри моей модели.

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

Теперь я должен поместить эту логику в свой контроллер (больше кода для записи) или в представление (кажется неправильным и грязным) или просто делать это по-другому.

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

Ответы [ 2 ]

7 голосов
/ 19 сентября 2010

Я обычно ставлю это в поле зрения.

ViewModel:

public IEnumerable<Foo> TaskDeadlineTimes { get; set; }

Вид:

<%= Html.DropDownListFor(
    x => x.SelectedValue, 
    new SelectList(Model.TaskDeadlineTimes, "Value", "Key")
) %>

И контроллер позаботится об установке значения этого свойства с помощью репозитория.

0 голосов
/ 19 сентября 2010

У нас есть дополнительный слой, который мы называем Строителями.

Контроллер создает конструктор и передает ему необходимую информацию.

Builder взаимодействует с контекстом (текущий пользователь, его роль и т. Д.) + Слой данных и генерирует модель со всеми действительными данными.

Чем контроллер передает эту модель в View.

...