如何让CheckBox在ASP.NET MVC中跨回发维护检查状态?

时间:2008-11-10 01:55:11

标签: asp.net-mvc

我有一个带有表单的ASP.NET MVC项目。在处理POST动词的Action方法中,我有一个自定义IModelBinder实现,它将表单数据绑定到我的模型实例。如果有错误,我使用bindingContext.ModelState.SetAttemptedValue()bindingContext.ModelState.AddModelError()将提交的值和错误消息保存到ModelState

这很好用,我可以看到使用Html.TextBox()(调用Html.InputHelper())呈现的输入控件上发生的预期行为。当我使用Html.CheckBox()(也调用Html.InputHelper())时,CheckBox的状态为 NOT 输出到<input />标记。

在我看来,Html.InputHelper()方法没有使用ModelState中的AttemptedValue来输入CheckBox类型的输入字段。

以下是ASP.NET MVC Html.InputHelper() method的代码。

为什么CheckBox attemptValue没有输出到输入标签。我在这里缺少什么,或者我需要通过检查ModelState并自己设置标签属性来手动处理这种情况吗?

更新11/09
以下是我用来输出CheckBox的HtmlHelpers调用:

<%= Html.CheckBox("IsDerived") %>

这是我用来注册尝试值的电话:

string isDerivedRequestValue = !string.IsNullOrEmpty(bindingContext.HttpContext.Request["IsDerived"]) ? bindingContext.HttpContext.Request.Form.GetValues("IsDerived") [0] : null;
bindingContext.ModelState.SetAttemptedValue("IsDerived", isDerivedRequestValue);

1 个答案:

答案 0 :(得分:1)

我不确定这是否是解决问题的最佳方法,但由于Html.InputHelper()方法没有检查AttemptedValue的CheckBox控件,我将以下内容添加到我的控制器中,该控制器嵌入了正确的值从ModelStateViewData,似乎很有效。

ViewData["IsDerived"] = ViewData.ModelState.ContainsKey("IsDerived")
                           ? bool.Parse(ViewData.ModelState["IsDerived"].AttemptedValue)
                           : false;

请确保在致电isChecked时未明确设置Html.CheckBox()参数值,因为这会覆盖ViewData中存储的任何值。