2

在 ASP.NET MVC 中,此处的 HtmlHelper 代码会生成一个复选框:

<%= 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" />

如果您想知道为什么会有一个额外的隐藏字段?- 然后 读这个。它绝对是一个让您首先想到“hmmmmm”的解决方案,但随后您意识到它是一个非常优雅的解决方案。

我遇到的问题是当我试图解析后端的数据时。好吧,如果将来在框架中发生任何变化,这与其说是一个问题,不如说是一个问题。

如果我使用内置绑定,一切都很好 - 这一切都为我完成了。但就我而言,我正在动态生成名称未知且模型中没有相应属性的复选框。

所以我最终不得不编写这样的代码:

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

}

或这个:

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

}

这两个我仍然看和畏缩 - 特别是因为不能保证这将永远是返回值。我想知道是否有一种方法可以访问模型绑定器使用的抽象层 - 或者我是否坚持我的控制器“知道”这么多关于 HTTP POST hacks。

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

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


仅供参考:我尝试了另外几件事,这就是我发现的:

forms["List_RETAIL_NOTIFICATION"] 评估为 "true,false" forms.GetValues("List_RETAIL_NOTIFICATION")[0]评估为 "true" (forms.GetValue("List_RETAIL_NOTIFICATION").RawValue as string[])[0]评估为 "true" forms.GetValues("List_RETAIL_NOTIFICATION").FirstOrDefault()评估为 "true"

4

2 回答 2

0

如果你:

  1. 为“自定义”属性值创建带有列表或其他内容的模型
  2. 继承自 DefaultModelBinder
  3. 重写 BindProperty,并将自定义属性值放在某个适当的位置,例如模型类型内的列表。

然后我认为这几乎可以满足您的需求。您正在使用布尔字段的默认绑定,但添加您自己的自定义属性,而不依赖于模型类型的反射。有关创建自定义模型绑定器的更多详细信息,请参阅候选版本的发行说明。

于 2009-02-03T13:36:24.877 回答
0

默认模型绑定器可以很好地处理这个问题。因此,如果您有:

public ActionResult Save(bool List_RETAIL_NOTIFICATION)

或者

public ActionResult Save(MyObjectWithABoolPropertyToBeBoundFromACheckBox myObject)

应该可以正常工作。

于 2009-02-03T20:33:27.780 回答