2017年12月26日 星期二

[.Net Tool] 使用bootstrap-multiselect實作帶checkbox與optGroup的DropDownList(使用ajax with json或model binding)

說明:
下拉式選單(DropDownList)是網頁常見的元素(element),
如果要做出帶有群組(optGroup),且項目前都有核取方塊(checkbox),如下圖:


該怎麼做呢?


這裡使用bootstrap-multiselect套件,使用BSD 3-Clause License,
商業使用須加上作者的版權聲明。

本例資料來源從Localdb產生,table為Country,如下圖:



並將資料整理成bootstrap-multiselect需要之格式,
如:
var data = [{
    label: 'America',
    children: [{ label: 'Canada', value: '2042101B-A6AF-4603-B04A-10D9257821CD' },
                    { label: 'American', value: '7E35A8AC-D415-4ED3-B572-725ACF7074FB' }]
    }, {
    label: 'Asia',
    children: [{ label: 'Taiwan, ROC', value: 'EB9A0E48-A541-430B-AAEA-C85D98DBA384' },
                    { label: 'Singapore', value: '0A5D7D14-9698-4AAA-B3F6-586EED21D0CD' }]
}];


定義GetAll方法來做這件事:


以下兩張圖是自訂的類別(轉換成Json用)


Controller部分,其中LoadAllCountries取得CountryService中的GetAll,
Update則是取得選擇的country Ids:


View部分,使用jQuery.ajax取得下拉式選單的資料,
使用form表單post選擇的country Ids:


呈現結果:

送出表單後,可取得多選的Ids:


to be continued...

2017年12月5日 星期二

[Network] TCP建立連線與關閉連線機制(connection establishment / termination)

TCP protocol屬於傳輸層(Transport Layer),提供可靠傳輸與流量控制,
host與host溝通需先建立連線,過程共需3次封包傳遞:

用2個封包,可能會發生:
第1次送出的封包delay,client等不到回應,只好再送出SYN封包,
server先收到第2個SYN封包,且完成工作並關閉連線了。
後來第1個SYN封包送到server了,server就會建立多餘的連線...
因此,使用3次封包來回較可靠,俗稱3向交握(3-way handshaking)機制。

交握流程如下圖:



圖中的SYN與ACK,代表該封包的旗標(flag),
在TCP封包的header中,用一6 bits的segment來表示:
[SYN]:000010。
[ACK]:010000。
[SYN,ACK]:010010。

其他segment:
seq:封包序號,由host自己維護,建立連線時+1。
len:封包的資料長度,不包含header。
ack:封包的確認號,建立連線時,為host接收到的序號+1。

對照使用Wireshark截取的封包。

Win:接收視窗,為該host陳述自己的可接受資料的快取byte。
MSS(Maximun Segment Size):表封包一次最大裝載資料byte。
同樣Win下,MSS愈大,傳遞的封包愈少。


下圖是關閉連線的機制。




參考資料:
http://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml