Определения
В ASP.NET MVC есть два способа связать модель в действии. Давайте назовем их «Способ связывания аргументов» и «Способ обновления». Они оба делают почти одно и то же, и делают это почти одинаково:
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
}
Первый метод создает модель с использованием строгой статической типизации. Вторая конструирует представленные пользовательские данные с парами имя / значение. Я считаю, что первый метод немного проще для чтения, но второй метод гораздо ближе к тому, что происходит на самом деле, когда контроллер вызывается веб-сайтом.
По причинам, выходящим далеко за рамки этого вопроса, я никогда не был убежден, что нужно создавать страницы aspx, используя лямбда-выражения вместо строк для привязки модели. Я был бы рад провести с вами эту дискуссию, но давайте не будем делать это здесь. Для целей этого вопроса давайте считать само собой разумеющимся, что я буду использовать встроенные методы HtmlHelper, которые принимают строки вместо расширений, которые принимают лямбда-выражения. Поэтому использование второго метода пар имя / значение имеет некоторое значение в качестве неформального теста на «динамический» характер страниц aspx. Конечно, он не заменяет интеграционное тестирование на сайте.
Вопрос (наконец-то!)
Я вижу преимущества и недостатки обоих методов. У меня вопрос, есть ли действительно сильный аргумент в пользу одного метода, который мне не хватает?
Редактировать Я ищу объективные ответы. Я ищу неочевидные причины , почему один метод лучше другого, не пытаясь принять участие в опросе.