Вопрос

У меня есть то, что кажется (для меня в любом случае), чтобы быть странной проблемой ...

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

Я испытал эту проблему и решение был излучать перечисляемый шаблон и нет Проверьте элементы списка.

Извините за то, что сделал этот ответ, а не комментарий - у вас не есть права комментировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top