定义
在 ASP.NET MVC 中,有两种方法可以在操作中进行模型绑定。我们将这些称为“绑定参数方式”和“UpdateModel 方式”。他们都做几乎完全相同的事情,而且他们以几乎完全相同的方式做这件事:
public ActionResult UpdateWithBindArguments(Foo model)
{
Repository.Update(model);
// error handling removed
return RedirectToAction(...)
}
public ActionResult UpdateWithUpdateModel()
{
Foo model;
UpdateModel(model); // part of MVC framework
Repository.Update(model);
// error handling removed
return RedirectToAction(...)
}
正如我所说,这些几乎完全相同。第一个可能更具可读性,但我可以克服它。
两种测试方法
我认为,重要的区别在于您如何对它们进行单元测试:
[TestMethod]
public void TestUpdateWithBindArguments()
{
var model = new Foo() { PropertyName = "Bar" };
var controller = new FooController();
var result = controller.UpdateWithBindArguments(model);
// assert
}
[TestMethod]
public void TestUpdateWithUpdateModel()
{
var formData = new FormCollection() { { "PropertyName", "Bar" } };
var controller = new FooController();
controller.ValueProvider = formData.ToValueProvider();
var result = controller.UpdateWithUpdateModel();
// assert
}
第一种方法使用强静态类型构建模型。第二个使用名称/值对构造提交的用户数据。我发现第一种方法更容易阅读,但第二种方法更接近于网站调用控制器时实际发生的情况。
出于这个问题范围之外的原因,我从来没有说服人们应该使用 lambda 表达式而不是字符串来构建 aspx 页面来进行模型绑定。我很乐意与您讨论,但我们不要在这里讨论。出于这个问题的目的,让我们理所当然地认为我将使用内置的 HtmlHelper 方法,这些方法采用字符串而不是采用 lambda 表达式的扩展。因此,第二种方法使用名称/值对作为针对 aspx 页面的“动态”性质的非正式测试具有一定的价值。当然,它不能取代针对站点的集成测试。
问题(终于!)
我看到了这两种方法的优点和缺点。我的问题是,是否有一个非常有力的论据支持我缺少的一种方法?
编辑我正在寻找客观的答案。我正在寻找为什么一种方法比另一种更好的非显而易见的原因,而不是试图进行民意调查。