我是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来完成,但我仍然想知道为什么这不起作用。
谢谢; - )
答案 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)%>