ASP.NET MVC2中使用FormCollection的正确方法是什么?

8

我目前正在使用新的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有哪些好处,更重要的是,如何正确使用它?


我看不到任何问题,旧模型坏了吗?为什么要换? - mxmissile
不,它并没有出错。似乎旧模型的强类型方法被放弃了,因为新控制器使用FormCollection而不是强类型对象。 - Faizan S.
2个回答

11

在v1中,您也有FormCollection对象。 但是最好使用一个类型化对象。 因此,如果您已经这样做了,请继续这样做。


1
+1 是的,FormCollection 从一开始就存在了。 如果它没有出问题,就不要修复它! - Ricardo Sanchez

0

通过使用FormCollection,你最终会手动将你的提交数据或查询字符串的键/值匹配到代码中使用的值,并使用字符串类型进行编码(导致代码变得混乱),而如果你使用表单模型,即“类型化对象”,内置的模型绑定可以为你完成这个工作。

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

此外,一旦你开始触及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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接