Я сравнительно недавно рассматриваю модели, и у меня возникают проблемы с их использованием. Здесь одна ситуация, когда мне интересно, что такое лучшая практика...
Я помещаю всю информацию, необходимую для просмотра в модель представления. Вот пример - пожалуйста, простите любые ошибки, это закодировано с верхней части моей головы.
public ActionResult Edit(int id)
{
var project = ProjectService.GetProject(id);
if (project == null)
// Something about not found, possibly a redirect to 404.
var model = new ProjectEdit();
model.MapFrom(project); // Extension method using AutoMapper.
return View(model);
}
Если экран разрешает только редактирование одного или двух полей, когда модель представления возвращается, у нее отсутствует достаточно данных (как и должно быть).
[HttpPost]
public ActionResult Edit(int id, ProjectEdit model)
{
var project = ProjectService.GetProject(id);
if (project == null)
// Something about not found, possibly a redirect to 404.
try
{
if (!ModelState.IsValid)
return View(model) // Won't work, view model is incomplete.
model.MapTo(project); // Extension method using AutoMapper.
ProjectService.UpdateProject(project);
// Add a message for the user to temp data.
return RedirectToAction("details", new { project.Id });
}
catch (Exception exception)
{
// Add a message for the user to temp data.
return View(model) // Won't work, view model is incomplete.
}
}
Мое временное решение состоит в том, чтобы воссоздать модель представления с нуля, повторно заполнить ее из модели домена, повторно применить данные формы к ней, а затем продолжить как обычно. Но это делает параметр модели зрения несколько бессмысленным.
[HttpPost]
public ActionResult Edit(int id, ProjectEdit model)
{
var project = ProjectService.GetProject(id);
if (project == null)
// Something about not found, possibly a redirect to 404.
// Recreate the view model from scratch.
model = new ProjectEdit();
model.MapFrom(project); // Extension method using AutoMapper.
try
{
TryUpdateModel(model); // Reapply the form data.
if (!ModelState.IsValid)
return View(model) // View model is complete this time.
model.MapTo(project); // Extension method using AutoMapper.
ProjectService.UpdateProject(project);
// Add a message for the user to temp data.
return RedirectToAction("details", new { project.Id });
}
catch (Exception exception)
{
// Add a message for the user to temp data.
return View(model) // View model is complete this time.
}
}
Есть ли более элегантный способ?
ИЗМЕНИТЬ
Оба ответа верны, поэтому я бы наградил их обоих, если мог. Ног идет в MJ, так как после проб и ошибок я считаю, что его решение было самым скудным.
Я все еще могу использовать помощников, Джимми. Если я добавлю то, что мне нужно отобразить в сумке просмотра (или просмотреть данные), например...
ViewBag.Project= project;
Затем я могу сделать следующее...
@Html.LabelFor(model => ((Project)ViewData["Project"]).Name)
@Html.DisplayFor(model => ((Project)ViewData["Project"]).Name)
Немного взлома, и в некоторых случаях требуется, чтобы модель домена была украшена System.ComponentModel.DisplayNameAttribute
, но я уже это делаю.
Мне бы хотелось позвонить...
@Html.LabelFor(model => ViewBag.Project.Name)
Но динамика вызывает проблему в выражениях.