Предположим, что у меня есть простая модель для объяснения цели:
public class Category
{
...
public IEnumerable<Product> Products { get; set; }
}
Вид:
@model Category
...
<ul>
@Html.EditorFor(m => m.Products)
</ul>
EditorTemplate:
@model Product
...
<li>
@Html.EditorFor(m => m.Name)
</li>
Обратите внимание, что мне не нужно определять EditorTemplate для IEnumerable<Product>
, я могу создать его только для модели Product
, а структура MVC достаточно умна, чтобы использовать свой собственный шаблон для IEnumerable. Он выполняет итерацию через мою коллекцию и вызывает мою EditorTemplate.
Выходной html будет что-то вроде этого
...
<li>
<input id="Products_i_Name" name="Products[i].Name" type="text" value="SomeName">
</li>
который я могу отправить на мой контроллер в конце концов.
Но почему MVC не делает трюк, когда я определяю EditorTemplate с именем шаблона?
@Html.EditorFor(m => m.Products, "ProductTemplate")
В этом случае я должен изменить тип свойства на IList<Product>
, выполнить итерацию по коллекции самостоятельно и вызвать EditorTemplate
@for (int i = 0; i < Model.Products.Count; i++)
{
@Html.EditorFor(m => m.Products[i], "ProductTemplate")
}
который кажется грязным обходным путем для меня. Это другое, более чистое решение для этого?