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