2010-01-28 144 views
8

我目前正在用新的ASP.NET MVC2框架開發一個應用程序。最初我開始在ASP.NET MVC1中編寫這個應用程序,我基本上只是將它更新到MVC2。在ASP.NET MVC2中使用FormCollection的正確方法創建方法?

我的問題在於,我沒有真正得到FormCollection對象與舊的Typed對象的概念。

這是我當前的代碼:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection collection) 
{ 
    try 
    { 
     Member member = new Member(); 
     member.FirstName = collection["FirstName"]; 
     member.LastName = collection["LastName"]; 
     member.Address = collection["Address"]; 

     // ... 

     return RedirectToAction("Details", new { id = member.id }); 
    } 
    catch 
    { 
     return View("Error"); 
    } 
} 

這是從MVC1應用程序的代碼:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Member member) 
{ 
    try 
    { 
     memberRepository.Add(member); 
     memberRepository.Save(); 

     return RedirectToAction("Details", new { id = member.id }); 
    } 
    catch 
    { 
    } 
    return View(new MemberFormViewModel(member, memberRepository)); 
} 

什麼是在MVC2切換到的FormCollection,更重要的好處 - 怎麼回事正確使用?

+0

我看不出來,是舊的模型壞了嗎?爲什麼轉換? – mxmissile 2010-01-28 16:05:40

+0

不,它沒有壞。它看起來像舊的模型強類型的方法被放棄,因爲新的控制器帶有FormCollection而不是強類型的對象。 – 2010-01-28 16:12:31

回答

11

您也有v1中的FormCollection對象。但是更喜歡使用類型化對象。所以如果你已經這樣做了,那麼繼續這樣做。

+1

+1是的,FormCollection自從一開始就一直存在。 如果它沒有損壞,請不要修復它! – 2010-02-12 02:23:12

0

通過使用FormCollection,您可以手動將您的發佈數據或查詢字符串鍵/值與您的代碼中使用字符串類型(導致字符串類型的代碼)中使用的值進行匹配,而替代內置的模型綁定如果您使用表單模型,也稱爲「鍵入對象」,請爲您執行此操作。

我認爲通過使用FormCollection,您也可能會失去在模型對象上使用方便的Data Annotation(斜線驗證)屬性的能力,這些屬性也是爲了與類型化的對象模型綁定而設計的。

此外,單元測試可能會變得更加麻煩,一旦你開始觸摸你的controller.Request.Form。您可能會發現自己必須模擬並設置一個HttpContextBase和一個HttpRequestBase,以便讓該模擬請求的.Form屬性返回您希望測試看到的NameValueCollection。與此不同,讓模型綁定完成這些工作,你這樣的:

// Arrange 
    var myModel = new MyModel(Property1 = "value1", Property2 = "value2"); 
    // Act 
    var myResult = myController.MyActionMethod(myModel); 
    // Assert 
    // whatever you want the outcome to be 

總之,我會建議不要使用的FormCollection到最大程度。

相關問題