Возможная ошибка в Html.DropDownList, выбранные значения не отражают? - PullRequest
0 голосов
/ 20 декабря 2010

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

У меня есть простой выпадающий список. Я пытаюсь заполнить его данными и предварительно выбрать элемент. Я преуспеваю в «заполнить его частью данных», но мне не удается предварительно выбрать предпочтительный элемент.

Я использую ASP.NET MVC 3 RC2.

Важные биты кода:

{
    // Bunch of code
    CategoryOptions = new SelectList(categories, "Id", "Slug", article.Category.Id);
}

Теперь ... CategoryOptions передается помощнику Html следующим образом:

@Html.DropDownListFor(a => a.Category, Model.CategoryOptions)

Я просмотрел значения, передаваемые помощнику, и подтвердил, что для одного из элементов выбрано значение true:

alt text

Однако, это не отражается в Html, генерируемом помощником. Ни один из тегов ... не имеет атрибута selected = "selected".

Я использовал Reflector, чтобы немного изучить код, и эта строка (SelectExtensions.SelectInternal) выглядит рискованно:

item.Selected = (item.Value != null) ? set.Contains(item.Value) : set.Contains(item.Text);

Я что-то здесь не так делаю? Или здесь виноват фреймворк (ASP.NET MVC 3 RC2).

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Хорошо ... Я только что исправил это.

Я изменил свою модель представления, чтобы использовать CategoryId вместо слагаемой категории.Итак, теперь мой взгляд выглядит следующим образом:

@Html.DropDownListFor(a => a.CategoryId, Model.CategoryOptions, new { @class = "ask-category-field" })

Я думаю, что выбираемое значение модели (в данном случае a => a.CategoryId) должно иметь тот же тип, что и выбранное значение.(Я уточню это объяснение, когда у меня будет больше времени для изучения кода фреймворка.) Но действительно умное кодирование :) Шляпы разработчиков ASP.NET MVC.

Теперь все работает отлично, как и ожидалось, и сохраняетизменения выбранного элемента на протяжении жизненного цикла PRG.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 20 декабря 2010

Выбранное свойство в раскрывающемся элементе фактически не устанавливает раскрывающийся элемент в HTML.

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

Мое решениебыл метод расширения в ViewDataDictionary, который позволяет вам установить значение данного списка выбора на основе выбранного элемента и идентификатора строки списка выбора.

public static void SetSelectedValueFor(this ViewDataDictionary viewDataDictionary, string key, IEnumerable<SelectListItem> items)
        {
            //  HACK: Store the selected item value in ViewData so that the DropDownListFor knows which one should be selected.
            //  It's a bit of a hack but it seems to be the only way I can do it since DropdownListFor ignores the Selected property on SelectListItem.
            var x = items.Where(c => c.Selected).FirstOrDefault();
            if (x != null)
            {
                viewDataDictionary[key] = x.Value;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...