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