文章内容
2016/12/9 16:27:15,作 者: 黄兵
ASP.NET MVC 使用Html.CheckboxFor为什么会生成一个相同name的hidden?
在我们使用ASP.NET MVC的Html.CheckBoxFor的时候,除了生成checkbox外,还会在后面紧跟着生成一个Hidden,这是为什么呢?
生成的HTML代码如下:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<form method="get">
<input data-val="true" data-val-required="IsChecked 字段是必需的。"
id="IsChecked" name="IsChecked" type="checkbox" value="true" />
<input name="IsChecked" type="hidden" value="false" /> 测试
</form>
</div>
</body>
</html>
我们将form的提交方式设置为get。在浏览器中将checkbox选中,然后点击提交
我们在URL中将得到如下的地址:http://localhost:6439/?IsChecked=true&IsChecked=false
我们看到,有两个IsChecked的,那我们在ASP.NET MVC Action中是接收哪个参数值呢?

提示:如果checkbox没有被勾选,他的值将不会提交到服务器上的
根据监视,我们可以看到,IsChecked最后接收到的值是true. Hidden的值false也被提交到了服务器, ASP.NET MVC 自动映射参数到action的参数上只取第一个。
ASP.NET MVC生成一个hidden的方式来保存false值,是为了IsChecked始终能有值提交到服务器上。
好了,我们再来测试一下Post的方式。

当checkbox选中后,仍然提交两个相同参数名的值上来。 照样和上面的结论是一样,两个相同name的参数上来后,ASP.NET MVC自动映射参数值到Action的参数上只取第一个!
总结:
不管是post还是get的方式提交,如果有参数名重复的提交,ASP.NET MVC将只取第一个参数值映射到Action的参数上。后面同参数名的值将会被ASP.NET MVC不做Action的参数映射,通过Form或者QueryString还是可以取到重复的参数!当然这是ASP.NET MVC自己的实现!
评论列表