Есть ли способ избежать повторения моего кода в представлении MVC Razor? - PullRequest
8 голосов
/ 19 апреля 2011

Мне нужно сделать что-то вроде этого:

<div class="editor-field">
   @Html.EditorFor(model => model.A1)
   @Html.ValidationMessageFor(model => model.A1)
</div>
<div class="editor-field">
   @Html.EditorFor(model => model.A2)
   @Html.ValidationMessageFor(model => model.A2)
</div>
<div class="editor-field">
   @Html.EditorFor(model => model.A3)
   @Html.ValidationMessageFor(model => model.A3)
</div>

Я использую MVC3 и новый для меня механизм просмотра бритвы.Я хотел бы избежать повторения одного и того же блока из четырех строк с A1, A2, A3, A4 ... A20.Есть ли какой-то способ, которым я могу использовать помощник, шаблон или другую функцию, чтобы сделать это, чтобы мне не пришлось повторять много строк кода.

Ответы [ 4 ]

12 голосов
/ 19 апреля 2011

Один из вариантов - использовать частичное представление, как упоминает @Ufuk.

Лучший способ IMO - использовать шаблон редактора, используя встроенные соглашения MVC.

Вместоотдельные свойства для A1, A2 и т. д. Поместите их в IEnumerable<Something> Somethings.

. Затем сделайте это в своем представлении:

@Html.EditorFor(model => model.Somethings)

Затем создайте шаблон редактора.с именем Something.cshtml и поместите его в Shared\EditorTemplates, и MVC сделает «неявный» для каждого цикла и отобразит все, что находится в шаблоне редактора для модели:

<div class="editor-field">
   @Html.EditorForModel()
   @Html.ValidationMessageForModel()
</div>

Не используйте цикл foreach - это ненужный и предотвратимый код супа.

Шаблон редактора HTML идентичен частичному, строго типизированному и всем.Различие заключается в соглашении о поиске файла, в то время как частичные представления нуждаются в явном частичном имени частичного представления.

Что это означает, если вы измените тип модели, он будет искать этот шаблон на основе моделиtype, допускающий очень мощный подход, основанный на соглашениях - вот что такое MVC.

6 голосов
/ 19 апреля 2011

Создать частичное представление, строго привязанное к этому классу.

A_Partial.ascx

<div class="editor-field">
   @Html.EditorFor(model)
   @Html.ValidationMessageFor(model)
</div>

Затем просмотрите их для каждого объекта.

@Html.Partial("A_Partial", model.A1)
@Html.Partial("A_Partial", model.A2)
@Html.Partial("A_Partial", model.A3)
0 голосов
/ 19 апреля 2011

Вы можете поместить их в массив:

@foreach(var item in new object[] { Model.A1, Model.A2 /* ... */ }) {
    <div class="editor-field">
       @Html.EditorFor(item)
       @* ... *@
    </div>
}
0 голосов
/ 19 апреля 2011

Если возможно, попробуйте поместить их все в один массив / словарь, а затем используйте foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...