在写 PHP 时,如果想要取得 CheckBox 被勾选的值,会把 CheckBox 的 name 后面加上中括号 []
,然后在 PHP 就可以直接用 name 取出阵列。
<div> <input type="checkbox" name="items[]" value="1" />aaa <br /> <input type="checkbox" name="items[]" value="2" />bbb <br /> <input type="checkbox" name="items[]" value="3" />ccc <br /> <button type="submit">送出</button></div><?php //此时的 $items 会是阵列,依序存放 checkbox 勾选的值 $items = $_POST["items"];?>
但在写 ASP.NET 时发现不太一样,因为 ASP.NET 取得 POST 资料时会使用 Request.Form[""]
这个物件,而我去看了一下 Form[""]
的回传值是字串型态,所以一定不可能像 PHP 一样可以取出阵列。
public sealed class HttpRequest{ public NameValueCollection Form { get; }}public class NameValueCollection{ public string this[string name] { get; set; }}
为了求证所以做了几个小测试
1.<input type="checkbox" name="items[]">
配合 Form["items"]
取不到 items 的值,所以我猜想在 ASP.NET 只将 items[]
当成字串而不是阵列处理。
2.<input type="checkbox" name="items[]">
配合 Form["items[]"]
取到 items 的值了,所以证实了我的想法,而且发现被选取的值会被逗号串联在一起。
3.<input type="checkbox" name="items">
配合 Form["items"]
CheckBox 的名称不加中括号,一样可以取的到值。
4.<input type="checkbox" name="items" value="1,2">
配合 Form["items"]
测试一下 value 本身包含逗号,取的到值不过这样我们无法辨别是否是多选,所以 CheckBox 的值不建议包含逗号。
整理后取值的程式码:
var items = Request.Form["items"];var itemList = string.IsNullOrWhiteSpace(items) ? new List<int>() : items.Split(',') .Select(it => int.Parse(it)) .ToList();
结语:
这些都是网页很基本的东西,但以往都是透过控制项,或 MVC 的模型繫结来完成,所以一直忽略这些细节的地方,现在写 ASP.NET 都尽量不用控制项,用最原始的 HTML 配合 AJAX 来完成,写起来反而觉得更清晰,更了解网页的运作模式。