Проблема с редактором MVC именованным шаблоном
-
26-10-2019 - |
Вопрос
У меня есть то, что кажется (для меня в любом случае), чтобы быть странной проблемой ...
Я создал простой шаблон редактора для SelectListItem (selectListItem.cshtml в папке ~/views/shared/editortemplates), например:
<ul class="select-list-item cell-15 col-3 omega clearfix">
@Html.EditorFor(c => c.Categories)
</ul>
Где C.Categories - это то, что
Это сработало нормально, но я хотел, чтобы еще один шаблон представил коллекцию с немного другой разметкой, поэтому я скопировал и переименовал шаблон редактора, например, «Categoryicons.cshtm» и призвал следующим образом:
<ul class="select-list-item cell-15 col-3 omega clearfix">
@Html.EditorFor(c => c.Categories, "CategoryIcons")
</ul>
Короче говоря, единственное отличие - я указываю названный шаблон редактора.
Когда я открываю страницу, теперь я получаю следующую ошибку:
Элемент модели, переданный в словарь, имеет тип 'System.collections.generic.list`1 [System.Web.mvc.selectListitem]', но этот словарь требует модели типа 'System.Web.mvc.selectistitem'
Объявление модели шаблона, в обоих шаблонах идентификатор:
@model System.Web.Mvc.SelectListItem
Я не понимаю, почему шаблон по умолчанию работает, а названный шаблон нет. Любая помощь будет оценена.
Спасибо.
Решение
Когда вы звоните @Html.EditorFor(c => c.Categories)
Он возвращается к шаблону по умолчанию для Ienumerable. Этот шаблон по умолчанию обеспечивается структурой MVC, и его поведение - вывод Html.EditorFor()
для каждого элемента в перечислении. Это, в свою очередь, излучает соответствующий шаблон редактора для каждого элемента в списке индивидуально - в вашем случае все это экземпляры SelectListItem
, Итак, в первом случае, SelectListItem
Шаблон используется для каждого элемента.
Во втором случае, явно установив ваш EditorFor
использовать конкретный шаблон редактора CategoryIcons
, вы говорите ему использовать этот шаблон редактора для все перечисление, вместо того, чтобы позволить перечисленным образом быть шаблонным по умолчанию, в свою очередь, используя шаблон для каждого перечисленного элемента.
Я пока не уверен в этом.
Одним из подходов было бы определить CategoryIcons
шаблон, чья модель является экземпляром IEnumerable<CategoryIcon>
, что просто представляет Model
перечисление и выполняет Html.EditorFor
для каждого элемента, с явной ссылкой на шаблон CategoryIcon
. Анкет Затем вы помещаете свой шаблон редактора для каждого элемента в этот шаблон (CategoryIcon
нет CategoryIcons
) Затем вы бы позвонили, делая @Html.EditorFor(c => c.Categories, "CategoryIcons")
.
Я собираюсь осмотреть вокруг, чтобы увидеть, есть ли лучшие способы сделать это, но я надеюсь, что это может быть полезно на данный момент. Было бы здорово, если бы шаблоны могли быть параметризованы, поэтому вы можете написать Ienumerable Stemplate, который принимает в качестве аргумента название шаблона для использования для каждого из его элементов.
Другие советы
Просто обновление, я наткнулся на этот вопрос, пытаясь сам решить одну и ту же проблему.
Что я закончил делать, так это то, что он итерация в каждом экземпляре коллекции и вызова Edtor для индивидуально, вроде этого:
<ul class="select-list-item cell-15 col-3 omega clearfix">
@for (int i=0;i<Model.Categories.Count;i++) {
@Html.EditorFor(c => c.Categories[i], "CategoryIcons")
}
</ul>
Все еще не чисто, но мне это нравится больше, чем унаследовать новый класс, как вы закончили.
(Извините, если мой синтаксис C# немного выключен, я пишу в vb.net)
Если вы используете Editorfor, я не думаю, что решение зацикливания будет работать. Похоже, что использование ienumerable шаблона является единственным способом правильного названия входов формы; Если вы только что звоните в редактор для неоднократно, то ваша форма <INPUT>
S будет иметь тот же идентификатор, а не индексированные идентификаторы.
Я испытал эту проблему и решение был излучать перечисляемый шаблон и нет Проверьте элементы списка.
Извините за то, что сделал этот ответ, а не комментарий - у вас не есть права комментировать.