先说下 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 监测得出)。