ASP.NET MVC коллекция ошибок привязки DropDownList? - PullRequest
5 голосов
/ 25 марта 2011

У меня есть представление с 1 раскрывающимся списком, сгенерированным из свойства Model, и 3 дополнительными раскрывающимися списками, сгенерированными из свойства массива

@Html.DropDownListFor(m => m.AgentType, Model.AgentTypeListItems)
@for (int i = 0; i < Model.AgentTypes.Length; i++)
{
    @Html.DropDownListFor(m => m.AgentTypes[i], Model.AgentTypeListItems)
}

Метод контроллера инициализирует коллекцию AgentTypeListItems + устанавливает значения по умолчанию для раскрывающегося списка AgentType и 3 раскрывающихся списка дляколлекция:

var model = new OptionsViewModel();

// for DropDownListFor
model.AgentTypeListItems = new[]
{
    new SelectListItem { Text = "1", Value = "1" }, 
    new SelectListItem { Text = "2", Value = "2" },
    new SelectListItem { Text = "3", Value = "3" },
};

// 1 dropdown in the model
model.AgentType = "2";

// 3 dropdowns in array
model.AgentTypes = new[] { "3", "2", "1" };

return View(model);

Когда я открываю его в браузере, я получаю «2» везде, хотя массив AgentTypes был инициализирован с другими значениями (!):

this is wrong

Когда я заменяю DropDownListFor на TextBoxFor:

@Html.TextBoxFor(m => m.AgentTypes[i])

Я получаю правильные значения во входных данных (!):

this is how it should be

Это означает, что TextBoxFor работает какожидается, но DropDownListFor нет.

Это ошибка в MVC DropDownListFor?

ОБНОВЛЕНИЕ Вот класс модели:

public class OptionsViewModel
{
    public SelectListItem[] AgentTypeListItems { get; set; }
    public string AgentType { get; set; }
    public string[] AgentTypes { get; set; }
}

Ответы [ 3 ]

14 голосов
/ 12 июня 2012

Я знаю, что этому посту больше года, но, похоже, это ошибка. Замена

@Html.DropDownListFor(m => m.AgentType, Model.AgentTypeListItems)
@for (int i = 0; i < Model.AgentTypes.Length; i++)
{
    @Html.DropDownListFor(m => m.AgentTypes[i], Model.AgentTypeListItems)
}

с

@Html.DropDownListFor(m => m.AgentType, Model.AgentTypeListItems)
@for (int i = 0; i < Model.AgentTypes.Length; i++)
{
    @Html.DropDownListFor(m => m.AgentTypes[i], new SelectList(Model.AgentTypeListItems, "Value", "Text", Model.AgentTypes[i])
}

у меня работает.

2 голосов
/ 25 марта 2011

закомментируйте вашу первую строку, @ Html.DropDownListFor (m => m.AgentType, Model.AgentTypeListItems) что происходит потом?

Попробуйте это:

        @for (int i = 0; i < Model.AgentTypes.Length;  i++)
        {     
            string selected = Model.AgentTypes[i];
            @Html.DropDownListFor(m => selected, new SelectList(Model.AgentTypeListItems, "Text", "Value",Model.AgentTypes[i]))
        }
0 голосов
/ 26 марта 2011

Интересно, похоже ли это на ситуации в WPF и Windows Forms, где использование одного и того же элемента источника для выбора списка «связывает» все элементы пользовательского интерфейса вместе за кулисами? Я вспоминаю о необходимости создавать отдельные копии объекта списка в этих ситуациях. Здесь стоит попробовать.

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