DropDownListFor в EditorTemplate, не выбирающем значение

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

Пример:

<%=Html.DropDownListFor(m => m.DocumentCategoryType, Model.DocumentCategoryTypeList) %>

Я знаю, что значения опции заполняются (от просмотра источника) и что моя Модель передается в с корректным Значением идентификатора (DocumentCategoryType).

Когда представление представляется, нет никакого выбранного пункта в моем выпадающем, и поэтому оно принимает значение по умолчанию к первому (невыбранному) значению.

У кого-либо есть какие-либо идеи?

Спасибо.

50
задан kmehta 16 December 2009 в 07:57
поделиться

5 ответов

Уф. В итоге я решил это вот так. Я надеюсь, что это будет исправлено в RTM.

   <%if(Model!=null){ %>
        <%= Html.DropDownListFor(m => m.DocumentCategoryType, new SelectList(Model.DocumentCategoryTypeList,"Value","Text", Model.DocumentCategoryType))%>
        <%}else{%>
            <%=Html.DropDownListFor(m => m.DocumentCategoryType, Model.DocumentCategoryTypeList) %>
        <%}%>
6
ответ дан 7 November 2019 в 11:04
поделиться

Это подтверждено как ошибка @ aspnet.codeplex.com и ведет себя так только для строго типизированных представлений.

Обходной путь: заполните свой список выбора в коде представления

, например

<%= Html.DropDown("DocumentCategoryType", new SelectList(Model.Categories,"id","Name",Model.SelectedCategory")) =>
14
ответ дан 7 November 2019 в 11:04
поделиться
Model.DocumentCategoryTypeList

Это, вероятно, ваша проблема. В SelectListitEs вы устанавливаете значение на вывод .toString ()?

 var list = new List<SelectListItem>()
                           {
                               new SelectListItem()
                                   {
                                       Value = Category.Book.ToString(),
                                       Text = "Book"                                     
                                   },
                               new SelectListItem()
                                   {
                                       Value = Category.BitsAndPieces.ToString(),
                                       Text = "Bits And Pieces"                            },
                               new SelectListItem()
                                   {
                                       Value = Category.Envelope.ToString(),
                                       Text = "Envelopes"                              }
                           };

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

0
ответ дан 7 November 2019 в 11:04
поделиться

Мы также решили решение, заполнив новый SelectList , в котором выбран соответствующий SelectListItem , но создали этот метод расширения, чтобы сохранить вызов DropDownListFor немного чище:

public static SelectList MakeSelection(this SelectList list, object selection)
{
    return new SelectList(list.Items, list.DataValueField, list.DataTextField, selection);
}

Тогда ваш вызов DropDownListFor изменится на:

<%= Html.DropDownListFor(m => m.DocumentCategoryType, Model.DocumentCategoryTypeList.MakeSelection(Model.DocumentCategoryType)) %>
28
ответ дан 7 November 2019 в 11:04
поделиться

Просмотр исходного кода ASP.NET MVC 2 позволяет найти некоторые решения этой проблемы. По сути, любой SelectListItem в SelectList , переданный во вспомогательном методе расширения, для свойства Selected задано значение true, не имеет никакого отношения к < option> визуализирован с атрибутом selected , примененным к элементу.

Атрибут selected в элементах определяется путем

1) проверки того, что методу расширения вспомогательной функции был передан SelectList . Если это null, платформа будет искать в ViewData значение, соответствующее ключу, который является свойством модели представления, для которого вы хотите отобразить раскрывающийся список. Если значение равно SelectList , оно будет использоваться для рендеринга