歡迎頁只有三個文字欄位。真實表單還有核取、下拉、多行文字與檔案。這一章的模式都一樣:用 讀取,用 寫回頁面,不要把整頁換掉。

讀取時只信 name

WebFormsJS 序列化的是表單控制項的 與值,和傳統 HTML 相同。 用來讓你的指令找節點,不參與提交。一個欄位通常兩個都要: 給回寫, 給讀取。

CodeBehind 教學在「送出表單資料」那一節,把各種 類型各讀一次:文字、顏色、日期、時間、、週、月、數字、電子郵件、電話、網址、搜尋、密碼、範圍、隱藏欄位、、核取、單選、,以及檔案。讀取方式只有兩條:

string email = context.Request.Form["txt_Email"];
IFormFile file = context.Request.Form.Files["upd_File"];

核取方塊沒被勾選時,該名稱不會出現在正文裡。用「是否有值」判斷,不要假設一定是 字串。單選按鈕會送出被選中那一顆的 。

做一份只有 與一顆核取方塊的頁面。控制器把兩者的原始字串用 寫進一個 。先不要美化。你要看到的是框架沒有幫你改寫欄位名稱。

訊息寫在頁面上,而不是寫進記錄

使用者看得到的結果應該是 DOM 的變化。公開的聯絡範例做法是:加一個 ,設背景色,寫入句子,幾秒後刪掉,並停用按鈕。

private void Button_Click(HttpContext context)
{
    string name = context.Request.Form["name"];

    WebForms form = new WebForms();
    form.AddTag("<form>", "h3");
    form.SetBackgroundColor("<h3>", "green");
    form.SetText("<h3>", name + "! Your message was sent.");
    form.Delete("<h3>");
    form.AssignDelay(3);
    form.SetDisabled("(button)", true);

    Write(form.Response());
    IgnoreViewAndModel = true;
}

這段裡 寫在 之後,所以指令順序是:建立、上色、寫字、刪除。 在這份教學裡跟在 後面,讓刪除延後發生,使用者才看得到那一行字。若你的多載需要行索引,就把延遲套在刪除那一行,而不是套在 上。套錯行的話,標題會等三秒才出現,或出現後立刻消失。

同一份回應裡的時間差只發生在帶有前置的那一行。其餘行仍依序立刻執行。

伺服器在這之前若要拒絕這次送出,就不要呼叫刪除。改成黃底或紅底的 ,把按鈕留著,讓人改完再送。上傳教學就是這樣分出「不是圖片」與「已寫入」兩條路。

檔案

有 時,表單要能送出 multipart。WebFormsJS 會改用 ,並在 為真時顯示進度條。控制器從 拿 。

公開範例的檢查順序值得照做,因為順序本身就是安全邊界:

  1. 檔案物件是否存在、長度是否大於 0。

  2. 副檔名是否落在你允許的清單,例如 、、、。不符合就寫提示、改背景色,然後 。

  3. 通過之後才 到你打算公開的目錄。

  4. 用 加一個 , 設定 , 限制寬度。

form.AddTag("<form>", "img");
form.SetAttribute("<form>|<img>-1", "src", filePath);
form.SetWidth("<form>|<img>-1", 400);

這裡用巢狀定位加上 ,避免頁面上另一張舊圖被改到。 應該是網站內的路徑。不要把使用者提供的檔名直接拼進可以跳出目錄的位置;教學範例為了短,直接使用上傳檔名,正式環境要換成你產生的名稱。

進度條只描述「位元組送出了多少」。它不表示檔案已經通過副檔名檢查,也不表示已經寫進磁碟。成功與否仍要看這次回應裡的 文字。

第一次載入就綁好事件

有些按鈕不在 的提交路徑上。Razor 範例在 裡先下 ,把點擊綁到一條查詢字串,指令則用 HTML 註解放進第一次的頁面:

WebForms form = new WebForms();
form.SetGetEvent("Button1", HtmlEvent.OnClick, "?add_state_1");
ViewData["WebForms"] = form.ExportToHtmlComment(true);

使用者按下按鈕時,瀏覽器對目前路徑發出帶有 的 Get。 看到查詢鍵,改走另一個處理方法,這次回 。

是類別提供的事件名稱常數。若你的套件版本裡沒有這個類型,就改用該版本接受的事件字串,例如文件裡的 。先讓編譯通過,再看 INI 裡的事件代碼是 還是 。