Когда я использую View Models, Partials, Templates и обрабатываю дочерние привязки с MVC 3

new для mvc3, у меня есть несколько вопросов, было бы полезно, если бы кто-то мог ответить/предоставить ссылки:

  • Когда следует использовать модели просмотра? Не рекомендуется ли использовать домен? Я считаю, что мои модели просмотра являются копиями моих объектов домена и не видят значения...
  • Когда я должен использовать Partials? Это только в том случае, если частичный вид будет повторно использован?
  • Когда следует использовать шаблоны отображения и шаблоны редакторов? Могу ли я использовать их без модели просмотра?
  • Как создать экран редактирования, где родительский и список дочерних объектов редактируются? то есть несколько полей вверху (родительский) и сетку полей ниже (например, редактируемые строки), в частности, как я могу сделать привязку? automapper не используется.

Спасибо!

Ответ 1

Когда следует использовать View Models? Не рекомендуется ли использовать домен? Я считаю, что мои модели просмотра являются копиями моих объектов домена и не видят значения...

Все модели всегда должны использоваться. Вы не должны использовать свои модели домена в представлении.

Просмотр моделей не является точной копией моделей домена. У них всегда есть некоторые различия, связанные с конкретными требованиями представления. Например, на одном экране вы хотели бы представить некоторые из свойств вашей модели домена, а на другом экране - другие свойства. Как следствие этого вы также будете иметь различные требования к валидации, поскольку одно свойство потребуется на одном экране и не требуется на другом экране. Таким образом, у вас также будут разные аннотации данных для этих моделей просмотров.

Когда я должен использовать Partials? Это только в случае повторного использования частичного представления?

Не только повторное использование представления. Частицы могут использоваться, чтобы сделать ваши представления более структурированными. Также, если вы используете AJAX, частичные операции упрощают его. Вы отправите запрос AJAX на действие контроллера, которое вернет частичное представление, позволяющее обновлять только части DOM.

Когда следует использовать шаблоны отображения и шаблоны редакторов? Могу ли я использовать их без модели просмотра?

Всегда. Вы можете использовать их с любой строго типизированной моделью, но вы всегда должны использовать модели представления (см. Ответ на предыдущий вопрос).

Как создать экран редактирования, в котором родительский и список дочерних объектов редактируются? то есть несколько полей вверху (родительский) и сетку полей ниже (например, редактируемые строки), в частности, как я могу сделать привязку? automapper не используется.

Это довольно широкий вопрос, но чтобы ответить на него, как всегда, вы начинаете с определения моделей просмотра, которые будут представлять/содержать свойства, которые вы хотели бы представить на этом экране для редактирования:

public class ChildViewModel
{
    [Required]
    public string Name { get; set; }
}

public class ParentViewModel
{
    [Required]
    public string Name { get; set; }

    public IEnumerable<ChildViewModel> Children { get; set; }
}

тогда контроллер:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        // TODO: Fetch an actual domain model from your repository,
        // and map it to the view model (AutoMapper is a great tool for the job)

        var model = new ParentViewModel
        {
            Name = "parent name",
            Children = Enumerable.Range(1, 5).Select(x => new ChildViewModel
            {
                Name = "child " + x
            })
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ParentViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // TODO: the model object here will contain the new values
        // => user AutoMapper to map it back to a domain model
        // and pass this domain model to the repository for processing

        return RedirectToAction("Index");
    }
}

и, наконец, представление:

@model ParentViewModel
@using (Html.BeginForm())
{
    <h2>Parent</h2>
    <div>
        @Html.LabelFor(x => x.Name)
        @Html.EditorFor(x => x.Name)
        @Html.ValidationMessageFor(x => x.Name)
    </div>

    <h2>Children</h2>
    <table>
        <thead>
            <tr>
                <th>Child name</th>
            </tr>
        </thead>
        <tbody>
            @Html.EditorFor(x => x.Children)
        </tbody>
    </table>
    <input type="submit" value="OK" />
}

а последняя часть - шаблон редактора для дочернего элемента (~/Views/Home/EditorTemplates/ChildViewModel.cshtml):

@model ChildViewModel
<tr>
    <td>
        @Html.LabelFor(x => x.Name)
        @Html.EditorFor(x => x.Name)
        @Html.ValidationMessageFor(x => x.Name)
    </td>
</tr>