发布IDictionary返回MVC模型

时间:2009-12-18 19:28:55

标签: asp.net-mvc vb.net

我是MVC的新手,所以请不要犹豫,建议一个更好/更清洁/更简单的方式来实现我想以更“MVC”友好的方式做的事情。

这里......

为了使这更容易,我将使用电影和流派的具体例子。类型可以与许多电影相关联。类型可以随着时间的推移而增加,电影也可以增加。

用例如下。用户希望通过选择他/她想要的流派来过滤电影。

所以,我有一个页面,在顶部有一个部分,用户可以选择任何类型的组合来过滤使用复选框。下面是这些类型的电影列表。

在MVC中,我尝试使用ViewPage(IDictionary(属性,布尔))来实现它,其中布尔值是否选择了特定的类型进行过滤。

然后我进入循环创建复选框供他们选择:

<% 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 %>

我已经删除了所有格式,专注于问题的关键。 所以在Dictionary genre.Value中将返回是否选中了复选框。

之后会有一大堆代码显示电影列表,具体取决于选择的类型。

我的问题是当我尝试回发(现在不使用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 个答案:

答案 0 :(得分:1)

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)%>