C# MVC 5复选框返回“;假,假”;或“;假”;
乍一看,这篇文章看起来像是复制品,但事实并非如此。相信我,我已经找遍了所有的堆栈溢出都没有用 总之,我从Html.CheckBoxFor中得到了一些奇怪的行为 我有一个具有以下定义属性的视图模型C# MVC 5复选框返回“;假,假”;或“;假”;,c#,asp.net-mvc,checkbox,C#,Asp.net Mvc,Checkbox,乍一看,这篇文章看起来像是复制品,但事实并非如此。相信我,我已经找遍了所有的堆栈溢出都没有用 总之,我从Html.CheckBoxFor中得到了一些奇怪的行为 我有一个具有以下定义属性的视图模型 [Display(Name = "User is active")] public bool IsActive { get; set; } 它在视图之前初始化 if (userInfo.isActive != null) { //Cast to bool because userInfo.is
[Display(Name = "User is active")]
public bool IsActive { get; set; }
它在视图之前初始化
if (userInfo.isActive != null)
{
//Cast to bool because userInfo.isActive is Nullable<bool>
model.IsActive = (bool)userInfo.isActive;
}
ModelState.Clear();
return View(model);
当model.IsActive被初始化为true,并且我没有取消选中该复选框时,controller post中model.IsActive的值为true,或者如果我取消选中该复选框,那么model.IsActive的值将返回为false,并且一切都很顺利
当model.IsActive初始化为false时会出现问题。我读过很多关于堆栈溢出的文章,解释说如果复选框未选中,那么返回“false”,如果选中,则返回“true,false”,但这不是我得到的行为。当复选框被初始化为false并且我在视图中检查它时,model.IsActive的值仍然返回false,当我检查表单元素的值时(参见controller post中的“var tmp”),它是“false,false”。“真,假”是期望值,不是吗?这仅在尝试将模型值从false更改为true时发生,不会出现从true更改为false的问题
那么堆栈溢出,到底发生了什么 您不需要更改复选框的
值
属性。如果你在没有它的情况下使用助手,你会看到这一点
@Html.CheckBoxFor(model => model.IsActive)
提交给
<input data-val="true" data-val-required="The IsActive field is required." id="IsActive" name="IsActive" type="checkbox" value="true" class="valid">
只需从@Html.checkboxforhelper中删除
@value=Model.IsActive
,它就会很好地工作。对不起,我应该已经指定了,我也尝试了,但没有传入@value,没有任何区别。我正在考虑创建一个标准的HTML复选框,并将值作为一个单独的参数传递给大家。在它们中设置@value会弄乱CheckBoxFor已经提供的绑定,因为您给它指定了lambda“model=>model.IsActive”。仅供参考,我完全按照您描述的方式重新创建了您的问题,然后通过删除属性修复了它。所以我理解你的沮丧,这表明这里可能发生了其他事情。您是否在视图中的其他位置引用了model.IsActive?我觉得非常愚蠢,model.IsActive在这段代码$(“#IsActive”).val(“@model.IsActive”)的页面底部被引用;我之所以这样做是因为之前复选框没有正确地呈现原始值(可能是因为HtmlatAttributes),但是JS覆盖了复选框的值。它现在运行良好…您是正确的,但问题是,当使用初始值false(model.IsActive作为false传入)创建复选框时,我选中复选框以将值更改为true,它仍然会作为false在帖子中传回。复选框的值没有改变。你以及更高层次的评论者都是正确的,如果你好奇,我在上一篇文章中以评论的形式解释了问题的具体原因。我已接受你的帖子作为正确答案。
@Html.CheckBoxFor(model => model.IsActive)
<input data-val="true" data-val-required="The IsActive field is required." id="IsActive" name="IsActive" type="checkbox" value="true" class="valid">
private static MvcHtmlString CheckBoxHelper(HtmlHelper htmlHelper, ModelMetadata metadata, string name, bool? isChecked, IDictionary<string, object> htmlAttributes)
{
RouteValueDictionary attributes = ToRouteValueDictionary(htmlAttributes);
bool explicitValue = isChecked.HasValue;
if (explicitValue)
{
attributes.Remove("checked"); // Explicit value must override dictionary
}
return InputHelper(htmlHelper,
InputType.CheckBox,
metadata,
name,
value: "true",
useViewData: !explicitValue,
isChecked: isChecked ?? false,
setId: true,
isExplicitValue: false,
format: null,
htmlAttributes: attributes);
}