Опубликовать IDictionary Вернуться к модели MVC - PullRequest
1 голос
/ 18 декабря 2009

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

Здесь идет ...

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

Вариант использования следующий. Пользователь хочет отфильтровать фильмы, выбрав желаемый жанр.

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

В MVC я пытаюсь реализовать это, используя ViewPage (из IDictionary (Genre, Boolean)), где логическое значение указывает, был ли выбран определенный жанр для фильтрации.

Затем я вхожу в цикл, который создает флажки для их выбора:

<% for each genre As KeyValuePair(Of Genre, Boolean) in Model %>
  <%=Html.Hidden("genre[" & i & "].Key", genre.Key.ID)%>
  <%=Html.CheckBox("genre[" & i & "].Value", genre.Value)%>
  <%=Html.TextBox("genre[" & i & "].Key.Name", genre.Key.Name)%>
<% Next %>

Я убрал все форматирование, чтобы сосредоточиться на сути проблемы. Таким образом, в словаре жанра. Значение будет возвращать, установлен флажок или нет.

После этого появляется фрагмент кода, который отображает список фильмов в зависимости от того, какие жанры были выбраны.

Моя проблема в том, что когда я пытаюсь отправить обратно (пока не пользуюсь Ajax), в словаре действия отображается значение Null:

<AcceptVerbs(HttpVerbs.Post)> _
Function FilterSelected(ByVal selectedGenres As IDictionary(Of MarketCategory, Boolean)) As ActionResult
    Return View("Index", theView)
End Function

Может кто-нибудь сказать мне, что мне не хватает? Кроме того, я знаю, что это можно сделать с помощью Ajax, и я, скорее всего, сделаю это с помощью Ajax, но мне все равно хотелось бы знать, почему это не работает.

Спасибо; -)

1 Ответ

1 голос
/ 18 декабря 2009

Изменить FilterSelected selectedGenres имя параметра на genre. DefaultModelBinder соответствует параметрам по имени:

Function FilterSelected(ByVal genre As IDictionary(Of MarketCategory, Boolean)) 

Вы должны также измениться

<%=Html.Hidden("genre[" & i & "].Key", genre.Key.ID)%>

до

<%=Html.Hidden("genre[" & i & "].Key.ID", genre.Key.ID)%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...