2010-01-28 109 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到最大程度。

相关问题