第 4 章的表單已經在頁面上。這一章補上控制器,然後對著網路面板把請求與回應讀完。範例的欄位名稱與官方教學一致,方便你對回文件。
控制器
先看這次 POST 有沒有帶來名為 的欄位。有,才代表送出鈕被按過。WebFormsJS 送出的正文與傳統 HTML 表單相同,多出來的是 這個標頭,而不是一堆框架專用的隱藏欄位。
using CodeBehind;
public partial class MyController : CodeBehindController
{
public void PageLoad(HttpContext context)
{
if (!string.IsNullOrEmpty(
context.Request.Form["btn_SetBodyValue"]))
{
btn_SetBodyValue_Click(context);
}
}
private void btn_SetBodyValue_Click(HttpContext context)
{
string name = context.Request.Form["txt_Name"];
string background = context.Request.Form["txt_BackgroundColor"];
int fontSize = context.Request.Form["txt_FontSize"].ToNumber();
WebForms form = new WebForms();
form.SetFontSize(InputPlace.Tag("form"), fontSize);
form.SetBackgroundColor(InputPlace.Tag("form"), background);
form.SetDisabled(InputPlace.Name("btn_SetBodyValue"), true);
form.AddTag(InputPlace.Tag("form"), "h3");
form.SetText(InputPlace.Tag("h3"), "Welcome " + name + "!");
Control(form);
IgnoreAll();
}
}
是 CodeBehind 對字串的擴充,教學用它把字級從表單文字變成整數。 是定位的建構方式,下一章會對照它的字串形式。五個方法各自變成回應裡的一行,順序與呼叫順序相同。
瀏覽器送出什麼
在姓名欄填 、字級 、背景 ,按下 Send。官方教學記錄到的正文是:
txt_BackgroundColor=violet&txt_FontSize=28&txt_Name=Nicolas&btn_SetBodyValue=Send
欄位順序依表單裡的 DOM 順序,教學頁上的按鈕值是他們的英文句子;你若把 改成 ,正文最後一段就會是 。伺服器只檢查這個名稱在不在,不檢查顯示文字。
同時看請求標頭,應該有:
Post-Back: true
沒有這個標頭,通常是腳本沒載入,瀏覽器改走傳統導覽。那時候你收到的會是整頁 HTML,而不是下面的 INI。
伺服器回什麼
[web-forms]
fs<form>=28px
bc<form>=violet
sd(btn_SetBodyValue)=1
nt<form>=h3
st<h3>=Welcome Nicolas!
對照呼叫,逐行讀:
@lYY@ 呼叫 & 回應行 & 畫面上的結果
& fs<form>=28px & 第一個 的字級變成 28 像素。整數多載會補上單位。
& bc<form>=violet & 同一個表單的背景色。
& sd(btn\_SetBodyValue)=1 & 依 找到按鈕並停用。 是真, 是假。
& nt<form>=h3 & 在表單內部末尾新增 。 是 Add Tag。
& st<h3>=Welcome Nicolas! & 寫進頁面上第一個 。
是這次回應能這麼短的原因。若忘記呼叫它,CodeBehind 仍會把 View 和版面渲染進正文。WebFormsJS 看不到開頭的 ,就會把整頁 HTML 塞進頁面裡的某個容器。症狀很固定:版面嵌進版面。
三種把請求送回去的函式
README 把用戶端入口收成三個函式。
送出表單欄位,而且應該出現在 裡面。提交鈕會自動變成 。它有一個輸出位置的多載:
:保留頁面,把回應加到 內部的開頭。
:放進第三個 (索引從 0)。
:放進這個 。
只有在回應不是 Action Control 時,這個輸出位置才決定正文被插到哪。若正文是指令,WebFormsJS 改的是指令點名的節點,不是這個輸出位置。
只請求 URL,不帶表單欄位。它不需要包在 裡。三個多載:
:請求你給的路徑,路徑可以帶查詢字串。
:在表單內則用該表單的 ,否則用頁面上第一個表單的 。
:請求瀏覽器現在這條 URL。
不再打伺服器。它渲染頁面上已經存在的某個 標籤裡的 。例如 會處理 class 為 的最後一個 標籤。這是把指令先夾在 HTML 裡、等事件發生再執行的做法。
帶資料, 只帶網址, 連網址都不打。三者最後若拿到的是 ,都會走進同一個指令執行器。
用戶端可以調的開關
開頭有一份 。改的是函式庫的行為,不是某一頁的指令。公開 README 列出的預設值如下。
@lY@ 選項 & 預設在做的事
& 表單裡有檔案欄位時,顯示上傳進度。
& 連線失敗時顯示 ,預設文字是 。
& 自動把提交鈕接上 。
& 預設 。設成 就忽略表單的 ,一律 POST。
& 非指令的回應要不要包進 。
& 標籤渲染前先塗一塊底色,預設 。
進度條的三個樣式鍵是 、、。它們是 CSS 字串,不是伺服器屬性。