最近陸續在ASP.NET MVC書籍及Blog文章看到類似建議:

在ASP.NET MVC Controller運用前端傳入資料時,即便可透過Request.Form["..."]獲得相同結果,仍建議採用FormCollection["..."]取代之。

由於書籍及文章並未闡述該用FormCollection取代Request.Form的明確理由,不知有沒有朋友跟我一樣,不明究理就無法堅定信念,會陷入不知"為何而換"的迷惘? 為此爬了好些文章,沒能找到簡單扼要的理由,不過從中推敲,還是有點心得。依我的理解,建議改用FormCollection由主要考量是:

  1. 便於單元測試
    針對Controller的特定Action進行單元測試時,要模擬FormCollection物件作為輸入參數,遠比Request.Form簡單,基本上只需要
        var fc = new FormCollection();
        fc.Add("field_name", field_Value);

    就能輕鬆搞定[參考]。
    且由此衍生可得,不只Request.Form,在Controller還應避免直接存取Request、Response物件,可大幅降低單元測試的難度。
  2. 保留客製擴充彈性
    在Controller宣告public ActionResult Boo(FormCollection formCollection),ASP.NET MVC運行時會由預設ModelBinder解析用戶端傳入內容,轉換為FormCollection傳給Action處理。預設狀況下其內容與Request.Form["…"]一致,但ASP.NET MVC允許我們自訂FormCollection的ModelBinder,可修改產生FormCollection的邏輯,此時若直接存取Request.Form將導致客製邏輯失效,破壞ASP.NET MVC原有的擴充彈性。

以上心得,分享給有同樣疑惑的朋友參考。如果有人想到其他理由,也歡迎回饋補充。


Comments

Be the first to post a comment

Post a comment