Сначала я связываю свой взгляд с ExpandoObject, чтобы я мог быстро выяснить,
форма моей модели, без необходимости тратить время
добавление / изменение / удаление реальных свойств в строго типизированных
ViewModel.
Ну, то, что вы делаете, очень плохо. Извините, что сказал это, но вы теряете сильную типизацию. Я не могу поверить, что людям действительно трудно использовать Ctrl + A , находясь в папке Models
в своем проекте, введите какое-нибудь имя, заканчивающееся ViewModel
, а затем введите пару prop + Tab + Tab и определить реальную строго типизированную модель представления.
Вместо этого люди пытаются использовать некоторые расширения, динамику, ViewDatas, ViewBags, CrapBags, ...
Итак, вот что я бы вам порекомендовал: используйте реальные модели представлений и забудьте о набранных неделях, иначе вы продолжите бороться с ASP.NET MVC. Поверь мне. Вот как это: -)
А когда вы используете AutoMapper для автоматической привязки между вашими моделями доменов и просмотра моделей, у вас будет больше времени пить пиво, как у меня:
public ActionResult DoStuff(int stuffId)
{
using (var ctx = new MyContext())
{
var model = ctx.Stuff.Where(x => x.Id == stuffId);
var vm = Mapper.Map<IEnumerable<MyDomainModel>, IEnumerable<MyViewModel>>(model);
return View(vm);
}
}
Посмотрите, насколько это веселее?
Очевидно, что если вы когда-нибудь захотите провести модульное тестирование действий вашего контроллера, вам следует использовать репозитории вместо жестко закодированных купольных контекстов Linq-To-I-Don't-Know-What в ваших контроллерах, например:
public ActionResult DoStuff(int stuffId)
{
var model = _stuffRepository.GetStuffs(stuffId);
var vm = Mapper.Map<IEnumerable<MyDomainModel>, IEnumerable<MyViewModel>>(model);
return View(vm);
}
Это так сложно?
Вы могли бы даже написать атрибут настраиваемого действия , чтобы ваше действие могло выглядеть так:
[AutoMap(typeof(IEnumerable<MyDomainModel>), typeof(IEnumerable<MyViewModel>))]
public ActionResult DoStuff(int stuffId)
{
var model = _stuffRepository.GetStuffs(stuffId);
return View(model);
}
ОК, мы становимся короче, тоньше, светлее. Как именно должны быть действия контроллера. На диете .