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 有什么好处,更重要的是 - 它是如何正确使用的?

4

2 回答 2

11

您在 v1 中也有 FormCollection 对象。但更优选使用类型化对象。因此,如果您已经这样做了,请继续这样做。

于 2010-01-28T16:06:25.247 回答
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。

于 2012-01-12T20:30:58.987 回答