Я относительно новичок в просмотре моделей и сталкиваюсь с некоторыми проблемами при их использовании. Вот одна ситуация, в которой мне интересно, какова лучшая практика ...
Я помещаю всю информацию, необходимую представлению, в модель представления. Вот пример - прошу прощения за любые ошибки, это закодировано на макушке моей головы.
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.
}
}
Есть ли более элегантный способ?
EDIT
Оба ответа верны, поэтому я бы наградил их обоих, если бы мог. Однако кивнул МДж, так как после проб и ошибок я нашел его решение самым худшим.
Я все еще могу использовать помощников, Джимми. Если я добавлю то, что мне нужно, чтобы отобразить в сумке просмотра (или просмотреть данные), например, так ...
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)
Но динамика вызывает проблему в выражениях.