在寫 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 來完成,寫起來反而覺得更清晰,更了解網頁的運作模式。
ASP.NET如果是原本的頁面,一般是不用POST,
直接Runat="server",然後用ASP.NET的Button觸發Click事件,
就會跑到後端的函數來執行了,
不過ASP.NET的事件要去了解一下,
因為他每次POSTBACK都會觸發到PAGE_LOAD事件,
不是直接執行Click事件,
這個多試幾次就會熟悉了。
感謝小魚大大的回覆,
您說的是我之前會使用的做法,
現在都盡量不用控制項,用原始的 HTML 來完成。
那乾脆用MVC吧,我現在新的案子都用MVC,
不過有時候會修改客戶之前的ASP.NET案子。
我也比較喜歡 MVC
不過目前公司標配是 Webform 搭配 ashx
我後來有盡量把 ashx 換成 Web API
不過 View 部分還是用 Webform
好想快點技術升級 QQ