在ASP.NET MVC2创建方法中使用FormCollection的正确方法?

时间:2010-01-28 15:59:09

标签: asp.net asp.net-mvc-2 formcollection

我目前正在使用新的ASP.NET MVC2框架开发一个应用程序。最初我开始在ASP.NET MVC1中编写这个应用程序,我基本上只是将它更新为MVC2。

我的问题是,我没有真正得到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有什么好处,更重要的是 - 它是如何正确使用的?

2 个答案:

答案 0 :(得分:11)

您也在v1中拥有FormCollection对象。但更优选使用类型化对象。所以如果你已经这样做了,那就继续这样做。

答案 1 :(得分:0)

通过使用FormCollection,您可以手动将您的发布数据或查询字符串键/值匹配到值中,以便在代码中使用字符串输入(生成字符串类型的代码),而内置的模型绑定可以执行此操作如果您使用表单模型,即“类型对象”,则可以使用此功能。

我认为通过使用FormCollection,您可能也会失去在模型对象上使用方便的数据注释(斜杠验证)属性的能力,这些属性设计用于类型化对象模型绑定。

此外,一旦您开始触摸您的控制器,单元测试会变得更加麻烦。请求。形式。您可能会发现自己必须模拟和设置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。