【问题标题】:checkbox in mvc returns nullmvc中的复选框返回null
【发布时间】:2020-05-27 16:03:20
【问题描述】:

我有这样的模型

    public Nullable<bool> Space { get; set; }

    public Nullable<bool> Lab { get; set; }

    public Nullable<bool> Consultation { get; set; }

    public Nullable<bool> Financial { get; set; }

    public Nullable<bool> Other { get; set; } 

在我看来,我初始化了复选框,你可以在这里看到:

@Html.CheckBoxFor(model => model.Space.Value, new { id = "CheckSpace" })  
@Html.CheckBoxFor(model => model.Lab.Value, new { id = "CheckLab" }) 
@Html.CheckBoxFor(model => model.Consultation.Value, new { id = "CheckConsultation"}) 
@Html.CheckBoxFor(model => model.Financial.Value, new { id = "CheckFinancial" }) 
@Html.CheckBoxFor(model => model.Other.Value, new { id = "CheckOther" }) 

但是当我将视图发布到我的控制器时,所有复选框的值都是空的,你能帮忙吗?

【问题讨论】:

  • 复选框是否被选中?

标签: c# asp.net-mvc asp.net-mvc-4 checkbox


【解决方案1】:

编辑

您应该使属性bool 而不是bool? 将它们绑定到@Html.CheckBoxFor。助手只理解值truefalse。然后使用

@Html.CheckBoxFor(model => model.Space, new { id = "CheckSpace" })  
@Html.CheckBoxFor(model => model.Lab, new { id = "CheckLab" }) 
@Html.CheckBoxFor(model => model.Consultation, new { id = "CheckConsultation"}) 
@Html.CheckBoxFor(model => model.Financial, new { id = "CheckFinancial" }) 
@Html.CheckBoxFor(model => model.Other, new { id = "CheckOther" }) 

助手生成一个

<input type="checkbox" name="Model Name" value="true" /> 

<input type="hidden" name="Model Name" value="false" /> 

这样,当复选框未选中时,会向服务器发送一个值。

您可能也不想为每个复选框设置一个特定的 id,而是让框架生成一个;您可以获取模型属性的 id,例如

@Html.IdFor(model => model.Space)

【讨论】:

  • 你能说得更具体点吗?您收到什么错误消息?
  • 我必须使用 value ,因为如果我不使用,我就会将 null 转换为 bool 错误
  • 无法将表达式类型 转换为返回类型 bool
  • 你有布尔类型的自定义 EditorTemplate 吗?
  • You should make the properties bool rather than bool? to bind them to @Html.CheckBoxFor 无论您使用 Html 扩展还是手动使用 &lt;input type="checkbox"&gt;,这似乎都是正确的:如果它可以为空,它就不起作用。
【解决方案2】:

他们发布null,因为 idname 应该与用于绑定 Model 属性的元素相同,并且您正在修改 id:

这样做:

@Html.CheckBoxFor(model => model.Space) 

它将被渲染为:

<input type="checkbox" id="Space" name="Space"/>

看到id和name是你模型属性的名字,如果你修改了id,那么属性在post中不会绑定到模型上,你会得到null。

【讨论】:

  • 再次返回null
  • 只有选中的复选框值才会发布
  • 这不是真的; idname 不需要相同。只有输入的name 用于绑定,而不是id,因此只有名称 POSTed 需要与传入的模型类型相关联。
  • 我亲身经历过更改 id 不会在模型中发布价值
  • 您可以通过手动创建仅具有 name 属性且没有 id 的所有输入并发布到名称属性与模型的设置器属性匹配的控制器操作来轻松测试情况并非如此。请参阅表单提交的 HTML 规范 - w3.org/TR/html401/interact/forms.html#h-17.13.2
【解决方案3】:

@Html.CheckBoxFor() 不适用于可为空的布尔值。如果您检查 @Html.CheckBoxFor(m =&gt;m.Space.Value) 生成的 html,您会看到类似

<input type="checkbox" name="Space.Value" .....

但您没有名为Space.Value 的属性,只有Space

如果你使用@Html.EditorFor(),你会看到它会生成一个包含 3 个值(true、false 和 null)的 select。

【讨论】:

  • 有解决办法吗?我只想呈现一个复选框而不是下拉列表,并将 null 视为 false。在我的情况下,将模型更改为不可为空是不可行的。
  • @zeppelin,一个复选框只能有两种状态——选中或未选中(开/关),相当于truefalse 它不能有第三个null 状态。如果您声称 nullfalse 表示相同的意思,那么您的模型应该是 bool,而不是 (Nullable&lt;bool&gt;) - 如果您不想更改数据模型,请使用视图模型
【解决方案4】:

检查您的复选框是否被禁用。 如果在视图端禁用了复选框,那么它将始终将 null 值发送回模型的 disabled 属性。

任何将复选框禁用属性设置为 true 的 CSS 类。

【讨论】:

    【解决方案5】:

    你可以用这个:

    @Html.CheckBoxFor(m=>m.Space.Value,new{Name="Space"}),
    

    我希望这会起作用,并且模型绑定会以常规方式发生。

    【讨论】:

      【解决方案6】:

      它会起作用的:

      @Html.CheckBox("Space", Model.Space.HasValue ? Model.Space.Value : false)
      

      【讨论】:

        【解决方案7】:

        关于这个: 使用 MVC5、Razor 和 C#,我做到了:

        我的模型是这样的:

        public partial class SOME_CLASS {
            ...
            public byte COM { get; set; }
            ...
        }
        

        我的视图在一个类似于 Tinyint 的布尔值中

        <label class="control-label col-lg-3">
            <input type="checkbox" name="COM" id="COM" value="1" />
            Comercial
        </label>
        

        选中状态会发送value=""属性中的值

        【讨论】:

          猜你喜欢
          • 2011-09-30
          • 2019-11-20
          • 1970-01-01
          • 1970-01-01
          • 2015-12-01
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 2014-07-25
          相关资源
          最近更新 更多