我有一个带有表单的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);
答案 0 :(得分:1)
我不确定这是否是解决问题的最佳方法,但由于Html.InputHelper()
方法没有检查AttemptedValue的CheckBox控件,我将以下内容添加到我的控制器中,该控制器嵌入了正确的值从ModelState
到ViewData
,似乎很有效。
ViewData["IsDerived"] = ViewData.ModelState.ContainsKey("IsDerived")
? bool.Parse(ViewData.ModelState["IsDerived"].AttemptedValue)
: false;
请确保在致电isChecked
时未明确设置Html.CheckBox()
参数值,因为这会覆盖ViewData
中存储的任何值。