ASP.NET MVC - Html.DropDownList - значение не устанавливается с помощью ViewData.Model - PullRequest
17 голосов
/ 24 декабря 2008

Только начали играть с ASP.NET MVC и наткнулись на следующую ситуацию. Это похоже на ошибку, но если это не так, объяснение будет приветствоваться:)

Вид содержит довольно простые вещи

<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>

Если модель не используется, значение и выбранный элемент устанавливаются в соответствии с ожиданиями:

//works fine
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX'
  ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC'

  return View();
}

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

//doesnt work
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  var model = new {
    MyList = "XXX", //set the selected item to be the one with value 'XXX'
    MyTextBox = "ABC" //sets textbox value to 'ABC'
  }

  return View(model);
}

Есть идеи? В настоящее время я думаю о том, что, возможно, при использовании модели мы ограничены установкой выбранного элемента в конструкторе SelectList вместо использования viewdata (который работает нормально) и передачей selectlist вместе с моделью - что будет иметь преимущество очистки кода немного - мне просто интересно, почему этот метод не работает ....

Большое спасибо за любые предложения

Ответы [ 7 ]

23 голосов
/ 24 ноября 2009

На самом деле, вам просто нужно ввести null для Html.DropDownList().
У меня была точно такая же проблема, и я использовал Reflector для просмотра исходного кода MVC.

В методе System.Web.Mvc.Extensions.SelectExtensions класса *1007* он проверяет, является ли параметр selectList null или нет. Если он передан как null, он правильно ищет SelectList.

Вот «Кодовый код».

ViewData["MyDropDown"] = new SelectList(selectListItems,
                             "Value",
                             "Text",
                             selectedValue.ToString()
                         );

Вот код просмотра HTML.

<%= Html.DropDownList("MyDropDown", null,
        "** Please Select **",
        new { @class = "my-select-css-class" }
    ) %>

Примечание. Я использую ASP.NET MVC 2.0 (бета-версия).

ПРИМЕЧАНИЕ ОБНОВЛЕНИЯ: 31 января 2012

После интенсивного использования ASP.NET MVC в течение последних 3 лет я предпочитаю использовать additionalViewData из Html.EditorFor() метода more.

Передайте [List Items] как anonymous объект с таким же именем свойства , как у свойства Model, в метод Html.EditorFor().

<%= Html.EditorFor(
    m => m.MyPropertyName,
    new { MyPropertyName = Model.ListItemsForMyPropertyName }
) %>

Если вы хотите получить более подробную информацию, см. мой ответ в другой ветке здесь .

5 голосов
/ 24 декабря 2008

После кучки рубки и рубки это сводится к следующей строке кода

if (ViewData.ModelState.TryGetValue(key, out modelState))

, что означает, что MVC пытается разрешить значение, просматривая только объект ViewData Dictionary <> и не обращаясь к объекту ViewData.Model.

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

<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>
2 голосов
/ 11 декабря 2010

Я явно опаздываю сюда. Но я хотел добавить этот комментарий, если кто-то еще сталкивался с этой проблемой.

В MVC 2. Вы можете сделать следующее, чтобы выбрать элемент ...

public ActionResult Edit(int id)
        {
            Team team = _db.TeamSet.First(m => m.TeamID == id);
            var fanYear = from c in _db.FanYearSet select c;
            ViewData["FantasyYear"] = new SelectList(fanYear, "YearID", "FantasyYear", team.FanYearReference.EntityKey.EntityKeyValues[0].Value);
            var league = from c in _db.LeagueSet select c;
            ViewData["League"] = new SelectList(league, "LeagueID", "League_Name", team.LeaguesReference.EntityKey.EntityKeyValues[0].Value);

            return View(team);
        }

Четвертый параметр принимает значение и выберет нужное значение в раскрывающемся списке. В моем примере у меня есть таблица с именем team, и у меня есть отношение, установленное к таблице с названием fanYear и league.

Вы видите, что я сначала получаю команду, которую редактирую, затем создаю выпадающий список фэнтезийного года и еще один для лиг. Чтобы определить год и лигу команды, мне нужно было использовать Entity Reference.

Просто хотел выложить это там. Я не мог найти никаких примеров этого.

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

попробуйте установить выбранное значение в действии контроллера при создании коллекции SelectList.

ViewData ["AddressTypeId"] = новый список выбора (CustomerService.AddressType_List (), "AddressTypeId", "Имя", myItem.AddressTypeId );

0 голосов
/ 16 сентября 2010

Меня беспокоит то, что вы можете использовать список только для одного поля. У меня есть сущности с несколькими пользовательскими полями, поэтому я использую следующее:

< %= Html.DropDownList("fieldAAA", 
                       new SelectList( (IEnumerable) ViewData["Users"], "Value", "Text", fieldAAA))

%> 
0 голосов
/ 10 апреля 2010

Если у вас есть проблемы с недействительным или нулевым ViewData, обратите внимание на действие вашего контроллера.

Предположим, у вас есть ViewData с именем MyList для Html.DropDownlist с именем MyList.

Если вы позвоните ModelState.AddModelError("MyList","Please select the profession"), вы замените содержимое списка ViewData текстом предупреждения.

Именно поэтому у людей в Интернете возникают нулевые проблемы с ViewData в DropDownList.

Суть в том, что обратите внимание на ваши идентификаторы в модели ошибок, они не должны мешать вашим элементам управления html.

0 голосов
/ 27 октября 2009

Хорошо, я могу что-то упустить из этой темы, однако в C # работает следующее:

Html.DropDownList("ProfessionGuid", (SelectList)ViewData["Professions"])

Где 'ProfessionGuid' - значение, которое будет выбрано в списке.

В VB.Net я верю, что это будет:

Html.DropDownList("ProfessionGuid", ViewData["Professions"] AS SelectList)
...