Использование моделей представления в ASP.NET MVC 3

Я относительно новичок в просмотре моделей, и у меня есть несколько проблем с использованием их. Вот одна ситуация, когда мне интересно, что лучше всего ...

Я помещаю всю информацию, которая нужна представлению, в модель представления. Вот пример - простите, пожалуйста, любые ошибки, это закодировано из моей головы.

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)

Но динамика вызывает проблемы в выражениях.

17
задан fretje 22 April 2011 в 11:38
поделиться