這一章把前面的零件裝成一頁。做完時,你應該能不看網路教學,獨立解釋回應裡的每一行。

頁面

@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。

再改三處,才算做完

  1. 姓名超過 80 個字元時走失敗路徑。不要只靠 HTML 的 。

  2. 成功時不要把訊息正文回寫到頁面。這份練習沒有存檔;若你加上存檔,頁面上只留「已送出」,避免把使用者輸入再嵌進 HTML 而不做編碼。 會把文字放進節點。含有 HTML 的姓名不應該被當成標記。

  3. 把 拿掉,重新整理與不重新整理各試一次。確認標題是被指令刪掉,而不是被重新載入清掉。

做完的標準:你能蓋住這章的程式,只看一份 INI,說出使用者會看到什麼、三秒後會看到什麼、哪一行是定位錯誤時最危險的一行。