SelectList возвращается как ноль в MVC DropDownList - PullRequest
4 голосов
/ 12 февраля 2009

У меня проблемы с использованием помощника Html.DropDownList в форме MVC RC1.

В классе контроллера я создаю список SelectList, подобный этому

SelectList selectList = new SelectList(db.SiteAreas, "AreaId", "AreaName");
ViewData["AreaId"] = selectList;

или как это

IEnumerable<SelectListItem> areaList =
    from area in db.SiteAreas
    select new SelectListItem
    {
        Text = area.AreaName,
        Value = area.AreaId.ToString(),
        Selected = false
    };
ViewData["AreaId"] = areaList;

, а затем добавьте его в программу просмотра с помощью этого вызова

<% using (Html.BeginForm())
   { %>
   <label for="sitearea">Site Area:</label>
   <span class="hint">The menu option to be highlighted when the page is open </span>
   <br />
   <%= Html.DropDownList("sitearea", (SelectList)ViewData["AreaId"], "Select Area Id")%>
   <%= Html.ValidationMessage("sitearea") %>
   <br />
   <br />
   <input type="submit" value="Add New Page" />
   <% = Html.AntiForgeryToken() %>
<% } %>

Итак, я добавляю опцию по умолчанию в выпадающий список. Если я запустлю эту страницу и нажму кнопку «Отправить», ничего не делая, я ожидал, что сработает действие POST для этой страницы, и код проверки в этом выпадающем списке сообщит мне, что я не выбрал опцию.

Вместо этого (после присоединения исходного кода MVC к моему проекту) я обнаружил, что получаю ArgumentNullException в selectextensions.cs.

$exception  {"Value cannot be null.\r\nParameter name: selectList"} System.Exception {System.ArgumentNullException}

Это относится к методу SelectInternal, который ожидает значение, отличное от нуля, для своего параметра selectList.

private static string SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool usedViewData, bool allowMultiple, IDictionary<string, object> htmlAttributes) 
{
   if (String.IsNullOrEmpty(name)) {
      throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
   }
   if (selectList == null) {
      throw new ArgumentNullException("selectList");
   }  
.. rest of method ..

Теперь все, что я сделал, - это обновил код с бета-версии MVC до RC1, и вдруг это произошло. Я видел ссылки на этот метод SelectInternal прежде, но не конкретное разрешение. Так может кто-нибудь помочь мне разобраться, почему происходит эта ошибка и как ее исправить?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 12 февраля 2009

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

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

1 голос
/ 12 февраля 2009

Это не ошибка в MVC, а по замыслу (AFAIK)

Вам необходимо переустановить данные вида и вернуть модель обратно в вид.

Просмотр данных существует только для текущего запроса + 1 (т.е. обратная запись).

1 голос
/ 12 февраля 2009

Вы обновились до обновления RC1?

http://www.haacked.com/archive/2009/01/30/aspnetmvc-refresh.aspx

Они исправили много проблем. Я почти на 100% уверен, что столкнулся с подобной ошибкой перед обновлением до обновления.

Дэйв ниндзя

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