Подготовка моделей для представлений ASP.NET MVC - PullRequest
0 голосов
/ 04 мая 2011

При возврате строго типизированных моделей для таких видов, как «Создать» и «Редактировать» (когда проверка объекта, который мы редактируем, не проходит), я обычно подготавливаю модели следующим образом:

    //
    // GET: /Invoice/Create
    public virtual ActionResult Create()
    {
        // prepare the empty model
        Invoice model = new Invoice();
        model.Client = new Client();
        model.Client.PostCode = new PostCode();
        return View(model);
    }

    //
    // POST: /Invoice/Create
    [HttpPost]
    public virtual ActionResult Create(Invoice document,
                                       FormCollection collection)
    {

        // check for errors
        if (!ViewData.ModelState.IsValid)
        {
            document.Client = new Client();
            document.Client.PostCode = new PostCode();
            return View(document);
        }

Теперь я знаю, что это какдругие тоже делают это, на самом деле, вы можете увидеть этот же подход в образце MVC Music Store и других.Тем не менее, это очень подвержено ошибкам, потому что можно случайно пропустить объект, на который ссылаются, который требуется в представлении.Это также требует слишком много размышлений о взаимодействии вида / модели.Что бы я хотел, это какой-то автоматизм.Типизированные значения свойств в моделях обычно не являются проблемой, потому что они по умолчанию либо нулевые, либо пустые строки.Однако ссылочные типы следует инициализировать с помощью new .., но рано или поздно мы получим повторяющиеся блоки кода, пропущенные свойства ссылочного типа и т. Д. И я тоже не думаю, что это хорошая практика кодирования.

Какие еще варианты мы могли бы использовать?

ОБНОВЛЕНИЕ:

Поскольку ответы вроде бы упущены (они не помогают нам думать о моделях вВ любом случае и требуют дополнительного кода в классах моделей), я подумал, будет ли работать эта опция:

  1. Использовать пользовательский фильтр действий,
  2. переопределить OnActionExecuted()
  3. используйте Reflection внутри этого метода, чтобы вынуть объект из Модели, перечислить его публичные свойства и попытаться инициализировать их.

У меня частично выполнены шаги 1, 2 и 3, но я не могу понять, какdo "... = new Client ();"программно с Reflection.

Ответы [ 3 ]

1 голос
/ 04 мая 2011

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

1 голос
/ 04 мая 2011

Сделайте так, чтобы свойства вашей модели возвращали новый экземпляр, если он нулевой

private Client client;
public Client Client
{
  get
  {
    if (client == null)
      client = new Client();

    return client;
  }
}
0 голосов
/ 04 мая 2011

Я не уверен, что полностью понимаю ваш вопрос.Вы хотите, что автоматизировано?ViewModels и Views?Вы создаете строго типизированные представления?

Я создал шаблон T4, на который я указываю базу данных, и он генерирует ViewModel для каждой таблицы.Внешние ключи становятся выпадающими списками, длинные строки получают TextArea вместо TextBox и т. Д. Затем я удаляю ненужные мне ключи и изменяю те, которые хочу сохранить.Это не полностью автоматизированный процесс, но он выполняет от 80 до 90 процентов работы, в зависимости от проекта.

Затем я генерирую строго типизированные представления из этих моделей представления.

Это также звучит как выможет быть заинтересованы в AutoMapper .

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