Правильный способ использования FormCollection в ASP.NET MVC2 Create Method? - PullRequest
8 голосов
/ 28 января 2010

В настоящее время я разрабатываю приложение с новой платформой ASP.NET MVC2. Первоначально я начал писать это приложение в ASP.NET MVC1, и я просто обновляю его до MVC2.

Моя проблема в том, что я не понимаю концепцию объекта FormCollection по сравнению со старым типизированным объектом.

Это мой текущий код:

[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));
}

Каковы преимущества перехода на FormCollection в MVC2 и, что более важно, - как это правильно используется?

Ответы [ 2 ]

11 голосов
/ 28 января 2010

У вас также был объект FormCollection в v1. Но более предпочтительно использовать типизированный объект. Поэтому, если вы уже это делаете, продолжайте.

0 голосов
/ 13 января 2012

Используя 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 в максимально возможной степени.

...