При возврате строго типизированных моделей для таких видов, как «Создать» и «Редактировать» (когда проверка объекта, который мы редактируем, не проходит), я обычно подготавливаю модели следующим образом:
//
// 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
.., но рано или поздно мы получим повторяющиеся блоки кода, пропущенные свойства ссылочного типа и т. Д. И я тоже не думаю, что это хорошая практика кодирования.
Какие еще варианты мы могли бы использовать?
ОБНОВЛЕНИЕ:
Поскольку ответы вроде бы упущены (они не помогают нам думать о моделях вВ любом случае и требуют дополнительного кода в классах моделей), я подумал, будет ли работать эта опция:
- Использовать пользовательский фильтр действий,
- переопределить
OnActionExecuted()
- используйте Reflection внутри этого метода, чтобы вынуть объект из Модели, перечислить его публичные свойства и попытаться инициализировать их.
У меня частично выполнены шаги 1, 2 и 3, но я не могу понять, какdo "... = new Client ();"программно с Reflection.