Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 5复选框返回“;假,假”;或“;假”;_C#_Asp.net Mvc_Checkbox - Fatal编程技术网

C# MVC 5复选框返回“;假,假”;或“;假”;

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

乍一看,这篇文章看起来像是复制品,但事实并非如此。相信我,我已经找遍了所有的堆栈溢出都没有用

总之,我从Html.CheckBoxFor中得到了一些奇怪的行为

我有一个具有以下定义属性的视图模型

[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);
        }