2010-01-28 2 views
8

Я в настоящее время разрабатываю приложение с новой структурой ASP.NET MVC2. Первоначально я начал писать это приложение в ASP.NET MVC1, и я в основном просто обновляю его до MVC2.Правильный способ использования FormCollection в ASP.NET 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 и что еще более важно - как это он используется правильно?

+0

Я не вижу, старая модель сломана? Зачем переключаться? – mxmissile

+0

Нет, это не сломано. Похоже, что старая модель сильно типизированного подхода была отвергнута, поскольку новые контроллеры поставляются с FormCollection вместо строго типизированного объекта. –

ответ

11

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

+1

+1 Да, FormCollection существует с самого начала. Если он не сломался, не исправляйте его! –

0

Используя форму FormCollection, вы вручную привязываете свои данные сообщения или строку или значения строки запроса к значениям, которые будут использоваться в вашем коде, используя строковое типирование (в результате получается строгий код), тогда как встроенная привязка модели может сделайте это для вас, если вы используете модели форм, например, «типизированные объекты».

Я думаю, что с помощью FormCollection вы, вероятно, также потеряете возможность использовать удобные атрибуты Data Annotation (косой черты) для ваших объектов модели, которые предназначены для использования с привязкой к типизированной объектной модели.

Кроме того, модульное тестирование может стать намного более громоздким после того, как вы начнете касаться своего контроллера. Request.Form. Вам может показаться, что вам нужно высмеять и настроить HttpContextBase и HttpRequestBase только для того, чтобы свойство .Form этого mock-запроса возвратило 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 в максимально возможной степени.