這一章把前面的零件裝成一頁。做完時,你應該能不看網路教學,獨立解釋回應裡的每一行。
頁面
@page
@controller ContactController
@layout "/layout.aspx"
<form method="post">
<label>Name
<input type="text" name="name" id="name" maxlength="80" />
</label>
<label>Message
<textarea name="message" id="message"></textarea>
</label>
<input type="submit" name="button" value="Send" />
</form>寫在 HTML 上,是給瀏覽器的限制。伺服器仍要再檢查一次,因為請求可以不經過這個頁面。
控制器的判斷
using CodeBehind;
public partial class ContactController : CodeBehindController
{
public void PageLoad(HttpContext context)
{
if (context.Request.Form["button"].Has())
Button_Click(context);
}
private void Button_Click(HttpContext context)
{
string name = context.Request.Form["name"];
string message = context.Request.Form["message"];
WebForms form = new WebForms();
if (string.IsNullOrWhiteSpace(name) ||
string.IsNullOrWhiteSpace(message))
{
form.AddTag("<form>", "h3");
form.SetBackgroundColor("<h3>-1", "yellow");
form.SetText("<h3>-1", "Name and message are required.");
Write(form.Response());
IgnoreViewAndModel = true;
return;
}
form.AddTag("<form>", "h3");
form.SetBackgroundColor("<h3>-1", "green");
form.SetText("<h3>-1", name + "! Your message was sent.");
form.Delete("<h3>-1");
form.AssignDelay(3);
form.SetDisabled("(button)", true);
Write(form.Response());
IgnoreViewAndModel = true;
}
}
是 CodeBehind 教學用來判斷表單鍵是否有值的擴充。若你的版本沒有它,改回 。失敗的那條路不要停用按鈕,也不要排刪除。成功的那條路才停用,並讓綠色標題在數秒後消失。
這裡的 假設這一輪指令剛剛才加入頁面上最後一個 。若版面裡已經有別的 ,負索引仍然指到全頁最後一個,不一定是你剛加的那個。更穩的寫法是 時帶上 id,之後都用 id 定位。
你要在網路面板裡看到的
失敗時,正文類似:
[web-forms]
nt<form>=h3
bc<h3>-1=yellow
st<h3>-1=Name and message are required.
成功時,在單參數 的教學簽名下,刪除那一行會帶延遲前置。行的先後仍是建立、上色、寫字、延遲刪除、停用:
[web-forms]
nt<form>=h3
bc<h3>-1=green
st<h3>-1=Ada! Your message was sent.
:3)de<h3>-1=1
sd(button)=1
若你的 把單位編成毫秒,前置裡的數字會是 這一類,而不是 。以實際回應為準,回頭改你對「使用者能看幾秒」的預期。
故意在版面放兩個 。不改控制器,再送出一次。歡迎句或錯誤句會出現在哪一個表單?用第 6 章的索引把 的目標改成第二個表單,讓 INI 裡出現 <form>1。
再改三處,才算做完
姓名超過 80 個字元時走失敗路徑。不要只靠 HTML 的 。
成功時不要把訊息正文回寫到頁面。這份練習沒有存檔;若你加上存檔,頁面上只留「已送出」,避免把使用者輸入再嵌進 HTML 而不做編碼。 會把文字放進節點。含有 HTML 的姓名不應該被當成標記。
把 拿掉,重新整理與不重新整理各試一次。確認標題是被指令刪掉,而不是被重新載入清掉。
做完的標準:你能蓋住這章的程式,只看一份 INI,說出使用者會看到什麼、三秒後會看到什麼、哪一行是定位錯誤時最危險的一行。