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

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

  1. Когда мне следует использовать View Models?Не рекомендуется ли использовать домен?Я считаю, что мои модели представлений являются копиями моих доменных объектов и не видят значение ...
  2. Когда мне следует использовать Partials?Только если частичное представление будет повторно использовано?
  3. Когда я должен использовать шаблоны отображения и шаблоны редактора?Могу ли я использовать их без модели представления?
  4. Как создать экран редактирования, в котором родительский объект и список дочерних объектов доступны для редактирования?то есть несколько полей вверху (родитель) и сетка полей внизу (например, редактируемые строки), в частности, как мне сделать привязку?Automapper не используется.

Спасибо!

1 Ответ

23 голосов
/ 28 мая 2011

Когда я должен использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...