ASP.NET Request.Form.Keys、GetValues、Files 没有对应项时,是 null 吗?

作者:vkvi 来源:ITPOW(原创) 日期:2022-3-15

先说下 Request.Form、Request.Files

如果有文件上传框,且 form enctype="multipart/form-data",那么这个文件上传框是算在 Request.Files 这边的。

如果有文件上传框,且 form enctype="application/x-www-form-urlencoded",那么这个文件上传框是算在 Request.Form 这边的。

再说说 Keys 和 AllKeys

Request.Form 和 Request.Files 都有 Keys 和 AllKeys 属性。

Keys 类型为:System.Collections.Specialized.NameObjectCollectionBase.KeysCollection,取个数用 Count 属性(注意这里不是方法)。

AllKeys 类型为:string[],取个数用 Length 属性。

Keys 和 AllKeys 其实一个意思,就看你觉得哪个好用了。

题外,我们不能:Request.Files[i].Key,只能 Request.Files.GetKey(i)。

继续说说 Keys 和 AllKeys

当遇到 2 个相同元素的文本框时,Request.Form 的 Keys 和 AllKeys 值为 1,忽略重复的

当遇到 2 个相同元素的文件框时(注意要 multipart/form-data),Request.Files 的 Keys 和 AllKeys 值为 2,不忽略重复的,再比如文件框 A 多选,选择了 2 个文件,文件框没选择文件,那么 Request.Files 的 Keys 和 AllKeys 值为 3。

Request.Form.GetKey(0)

前面谈的 Keys、AllKeys 怎么用都不会出异常。

而 Request.Form.GetKey(0),则当 index 越界时(没有内容时,0 就越界),就会触发异常:索引超出范围。必须为非负值并小于集合大小。

Request.Form.GetValues(0)

跟 GetKey(0) 一样,越界就会触发异常:索引超出范围。必须为非负值并小于集合大小。

Request.Form.GetValues(name)

如果并没有 POST 任何东西过来,不异常,其值类型为 string[],其值为 null。所以要使用 Length 属性的话,建议使用 ?.,而不是直接 .。请参见:C# 带问号 ? 的操作符大全:?:、?.、?[]、??、??=

总结

也就是说 GetXxx(int),这种要注意:越界就会触发异常

后记

如何创建一个没有内容的 POST,如下,注意不要给 submit 赋 name:

<form id="form1" method="post">
	<input type="submit" value="click" />
</form>

因为这里面所有的控件,都没有 name,所以 POST 的为空的(通过 Chrome 监测得出)。

相关文章