Когда мне использовать модели просмотра, части, шаблоны и обрабатывать дочерние привязки с помощью MVC 3

#asp.net-mvc-3 #viewmodel #partials #editortemplates #modelbinder

#asp.net-mvc-3 #viewmodel #части #редактирование шаблонов #modelbinder

Вопрос:

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

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

Спасибо!

Ответ №1:

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

Модели просмотра следует использовать всегда. Вам не следует использовать модели вашего домена в представлении.

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

Когда я должен использовать частичные элементы? Это только в том случае, если частичное представление будет использоваться повторно?

Не только если представление будет использоваться повторно. Частичные элементы могут быть использованы для придания вашим представлениям большей структурированности. Также, если вы используете 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>
  

Комментарии:

1. Спасибо! Это действительно полезно, просто хочу прояснить несколько моментов: 1. Может ли modelbinding автоматически связывать как родительский, так и дочерний элементы? 2. Нужно ли мне создавать шаблоны отображения и редактора для EditorFor для работы? Или mvc достаточно умен, чтобы создавать их для меня на основе моделей представления? 3. Должна ли модель представления для конкретного вида редактирования содержать все необходимое для этого вида или только редактируемые поля? Некоторые поля могут потребоваться только для чтения…

2. У меня был тот же вопрос о том, как вы обрабатываете модели просмотра для редактирования и создания. У меня ситуация, когда при редактировании есть обязательные поля, которые не могут быть заполнены во время создания из-за отсутствия исходящих дочерних данных. Создаете ли вы две модели представления в этом случае?

3. @PilotBob, да, в данном случае две модели представления.

4. @DarinDimitrov Я заранее угадал ваше имя, указав на уровень объяснения. Ты потрясающий!!!

5. В вашем примере вы нарушаете свое собственное правило о всегда использовании шаблонов редактора (ParentViewModel может быть отображен с использованием шаблона редактора). Я бы сказал, что вы должны использовать их только тогда, когда они будут повторно использоваться в разных представлениях или, как вы говорите, обеспечивают структуру вашего кода презентации.