как я делал в проекте:
public interface IBuilder<TEntity, TInput>
{
TInput BuildInput(TEntity entity);
TEntity BuildEntity(TInput input);
TInput RebuildInput(TInput input);
}
реализуйте этот интерфейс для каждой сущности или / и для некоторой группы сущностей вы можете сделать универсальную и использовать ее в каждом контроллере;используйте IoC;
вы помещаете свой код отображения в первые 2 метода (не имеет значения технология отображения, вы можете даже сделать это вручную), а RebuildInput предназначен для получения ModelState.IsValid ==false, просто вызовите BuildEntity и BuildInput снова.
и использование в контроллере:
public ActionResult Create()
{
return View(builder.BuildInput(new TEntity()));
}
[HttpPost]
public ActionResult Create(TInput o)
{
if (!ModelState.IsValid)
return View(builder.RebuildInput(o));
repo.Insert(builder.BuilEntity(o));
return RedirectToAction("index");
}
На самом деле я иногда делаю универсальный контроллер, который используется для большего количества объектов, таких как здесь: aspуниверсальный контроллер .net mvc
РЕДАКТИРОВАТЬ: вы можете увидеть эту технику в примере приложения asp.net mvc здесь: http://prodinner.codeplex.com