iT邦幫忙

1

[C#][ASP.NET] 取得 CheckBox 被勾選的 Value 值

在寫 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[] 當成字串而不是陣列處理。

https://ithelp.ithome.com.tw/upload/images/20171126/20106865sAjE0jgSt8.jpg

2.<input type="checkbox" name="items[]"> 配合 Form["items[]"]

取到 items 的值了,所以證實了我的想法,而且發現被選取的值會被逗號串聯在一起。

https://ithelp.ithome.com.tw/upload/images/20171126/20106865OkFkkuZTxC.jpg

3.<input type="checkbox" name="items"> 配合 Form["items"]

CheckBox 的名稱不加中括號,一樣可以取的到值。

https://ithelp.ithome.com.tw/upload/images/20171126/20106865Jvu9dYKkWO.jpg

4.<input type="checkbox" name="items" value="1,2"> 配合 Form["items"]

測試一下 value 本身包含逗號,取的到值不過這樣我們無法辨別是否是多選,所以 CheckBox 的值不建議包含逗號。

https://ithelp.ithome.com.tw/upload/images/20171126/20106865D42EQ2uNgj.jpg

整理後取值的程式碼:

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 來完成,寫起來反而覺得更清晰,更了解網頁的運作模式。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
小魚
iT邦大師 1 級 ‧ 2017-11-26 15:37:27

ASP.NET如果是原本的頁面,一般是不用POST,
直接Runat="server",然後用ASP.NET的Button觸發Click事件,
就會跑到後端的函數來執行了,
不過ASP.NET的事件要去了解一下,
因為他每次POSTBACK都會觸發到PAGE_LOAD事件,
不是直接執行Click事件,
這個多試幾次就會熟悉了。

感謝小魚大大的回覆,
您說的是我之前會使用的做法,
現在都盡量不用控制項,用原始的 HTML 來完成。
/images/emoticon/emoticon37.gif

小魚 iT邦大師 1 級 ‧ 2017-11-26 16:12:07 檢舉

那乾脆用MVC吧,我現在新的案子都用MVC,
不過有時候會修改客戶之前的ASP.NET案子。

我也比較喜歡 MVC
不過目前公司標配是 Webform 搭配 ashx
我後來有盡量把 ashx 換成 Web API
不過 View 部分還是用 Webform
好想快點技術升級 QQ

我要留言

立即登入留言