Несколько представлений против одного «сложного» представления в MVC - PullRequest
1 голос
/ 29 ноября 2010

Это произошло во время одной из наших ретроспектив и потребовало дополнительной обратной связи и выборочной проверки.В настоящее время у нас есть несколько представлений, которые включают / отключают на основе логических флагов (например, Model.IsNew).Я считаю, что представления должны быть настолько простыми, насколько это возможно, и контроллеры должны определять данные для этого представления, а не обязательно, как это работает.Я думаю, что представления, частичные или полные, должны быть «рассказаны» о том, что делать, и обрабатывать это по сравнению с представлением, определяющим, что следует показать / скрыть.Очень простой пример выглядит следующим образом, но охватывает обе стороны этого и в основном отражает то, что у нас есть ...

Контроллер имеет пару методов (post / get), называемых Details.[Get] Details имеет один параметр, Id и [Post] Details принимает идентификатор и модель представления.Внутри поста метод длиной ~ 30 строк проверяет правильность модели, определяет, является ли она новой, изменилось ли определенное значение (вызывает перенаправление) и т. Д. (Я думаю, что это неверно).[Get] Details проверяет пустой идентификатор, заполняет необходимые выпадающие списки, ничего особенного (я думаю, что это правильно).Сам подробный вид содержит небольшую логику: If (! Model.IsNew) {RenderAction (History => History.Show (id);}) (я думаю, что это в пределах if неверно, Show должно знать, что отображать,независимо от того, является ли он новым). Плюсом к этому является то, что макет для указанного подробного представления не выполняется дважды. Детали / Добавить будут почти идентичными, за исключением некоторых отключенных полей в зависимости от состояния (возможно, это должны быть частичные?) - объектможно отключить / удалить, делая значения редактируемыми или нет.

Мысли, мнения, идеи?

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010

почему бы не создать несколько представлений и действий?

Details

Edit
[HttpPost]
Edit

Create
[HttpPost]
Create

Тогда они могут совместно использовать объект модели

public ThingModel
{
    public Thing Thing { get; set; }
}

или сделать действия Create и Edit более безопасными (предотвратить внедрение html)) модель, которая также позволит вам использовать встроенные параметры проверки.

public ThingEditorModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public bool IsNew { get { return Id == 0; } }
}

И затем для редактирования и создания вы можете создать EditorTemplate (Shared / EditorTemplates / ThingEditor.ascx), который можно использовать совместно для создания и редактирования.

0 голосов
/ 29 ноября 2010

Я думаю, что вы на правильном пути ... используйте "основной" вид для макета, а затем используйте шаблонные помощники для "логики".Опирайтесь на Html.DisplayFor (x => x.Thing) и EditorFor

Вы определенно не хотите макет в двух местах.

...