2009-02-03 59 views
2

在ASP.NET MVC复选框通过的HtmlHelper代码在这里产生的FormsCollection物体接收MVC复选框值的解释:抽象通过

<%= Html.CheckBox("List_" + mailingList.Key, true) %> 

因为这HTML:

<input id="List_NEW_PRODUCTS" name="List_NEW_PRODUCTS" type="checkbox" value="true" /> 
<input name="List_NEW_PRODUCTS" type="hidden" value="false" /> 

万一你想知道为什么有一个额外的隐藏领域? - 然后read this。它绝对是一个让你首先想到'嗯'的解决方案,但是你意识到它是一个非常优雅的解决方案。

我遇到的问题是当我试图解析后端数据。那么它的问题就不那么重要了,如果将来有什么事情要在框架中改变的话。

如果我使用内置的绑定,一切都很棒 - 它为我完成。但在我的情况下,我动态生成未知名称复选框,并在我的模型中没有相应的属性。

所以,我最终不得不像这样写代码:

if (forms["List_RETAIL_NOTIFICATION"] == "true,false") { 

} 

或本:

if (forms.GetValues("List_RETAIL_NOTIFICATION")[0] == "true") { 

} 

这两者我还是看和畏缩 - 尤其是因为世界上没有保证,这将始终成为回报价值。我想知道是否有一种方法可以访问模型绑定器所使用的抽象层 - 或者如果我与我的控制器卡在一起,“知道”这些关于HTTP POST hack的内容。

是的我可能会有点挑剔 - 但也许是一个更聪明的方式使用模型绑定,我可以用来读取动态创建的复选框参数。

此外,我希望这篇文章可以帮助其他人搜索:“真实的,错误的”。尽管我知道它为什么这样做,我只是忘了,花了一点时间才意识到'呃'。


FYI:我试过其他一些东西,这是我发现:

forms["List_RETAIL_NOTIFICATION"]评估为“真,假” forms.GetValues("List_RETAIL_NOTIFICATION")[0]评估为“真” (forms.GetValue("List_RETAIL_NOTIFICATION").RawValue as string[])[0]评估为“真” forms.GetValues("List_RETAIL_NOTIFICATION").FirstOrDefault()评估板为 “true”

回答

0

如果您:

  1. 创建一个列表Ø模型r为“自定义”属性值
  2. 固有DefaultModelBinder
  3. 重写BindProperty,并且自定义属性值在某个适当的位置,如模型类型中的列表。

然后,我认为这几乎是你想要的。您正在使用布尔字段的默认绑定,但添加了您自己的自定义属性,而不依赖于模型类型的反射。有关创建自定义模型联编程序的更多详细信息,请参阅Release Candidate的发行说明。

0

默认的模型活页夹可以处理这种情况。所以,如果您有:

public ActionResult Save(bool List_RETAIL_NOTIFICATION) 

public ActionResult Save(MyObjectWithABoolPropertyToBeBoundFromACheckBox myObject) 

中应该可以正常工作。

+0

谢谢,但正如我所说的“我动态生成名称未知且在我的模型中没有相应属性的复选框”。复选框表示用户可以注册的所有不同邮件列表 - 这是数据库驱动的 – 2009-02-03 22:33:55