请选择 进入手机版 | 继续访问电脑版

无忧编程_ASP.NET  / C# / PHP 程序员的软件世界

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 98|回复: 1

@Html.CheckBoxFor输出两种控件的原因分析

[复制链接]

13

主题

14

帖子

87

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
87
发表于 2017-10-16 17:33:59 | 显示全部楼层 |阅读模式
@Html.CheckBoxFor输出两种控件的原因分析在MVC中当使用@Html.CheckBoxFor时表单上会产生两种控件checkbox和hidden,比如:

@Html.CheckBoxFor(model => model.IsTop)
对应

<input type ="checkbox" id="IsTop" name="IsTop" value="true"/>
<input type ="hidden" name="IsTop" value="false"/>
为何???且看关与Checkbox value 属性的定义和使用:

value 属性可设置或者返回 checkbox 的value属性值。

复选框的 value 属性值不会显示在用户界面中。value 属性用于表单数据的提交(只有选中的复选框才会传递数据到服务端,如果什么都没选则不传递复选框数据)。

至此就应该明白了。

当未选中复选框时,在Controller中接受到的数据为”false”,该值来自hidden控件,checkbox的值不会被传递,所以如果没有同名的hidden控件,那么在Controller中是得不到[IsTop]参数的。

当选中复选框时,在Controller中接受到的数据就为”true,false”。

那么问题又来了,字符串”false”,”true”可以转换成bool类型,那么”true,false”也可以吗?答案自然是不可以的。

那MVC中又是如何转换的呢?这里恕我没查源码,不能告知,但可以猜测是做了字符串的分割,以”,”为分隔符,取第一个子字符串。

另外如果我们不使用HTML辅助方法的形式,而是直接写两种控件,需要注意checkbox和hidden控件的顺序不能颠倒,不然绑定到的值一直为”false”。

在一注意,checkbox选中时value默认值为”on”,需要显示为value赋值为”true”。

说明:示例中的[IsTop]字段为bool类型。

回复

使用道具 举报

13

主题

14

帖子

87

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
87
 楼主| 发表于 2017-10-16 17:46:37 | 显示全部楼层
@Html.CheckBoxFor(m => m.Bool)
使用CheckBoxFor方法得到的html代码会是下面这个样子

在生成一个复选框的同时会同时得到一个type为hidden的input控件,复选框的value为true,hidden的value则为false,两个控件拥有相同的name属性。
为什么会有两个name值相同的input呢,如果我们选中该复选框不是把true和false都传递给服务端了。
120906583796590.png

1.未选中checkbox
未选中复选框比较好理解传递的就是hidden控件的value值,此时服务端得到的是false。如果没有hidden,服务端会得到null。

2.选中checkbox
选中的时候服务得到的值就是"true,false",此时会使用true值而忽略掉false

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软件编程 Inc.  

GMT+8, 2017-12-17 12:12 , Processed in 0.226069 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表