2011-10-03 9 views
5

W MVC2 tworzyłem silnie typowane widoki w taki sposób, że gdy publikowałem, nigdy nie użyłem obiektu FormCollection. Moje podpisy zawsze wyglądało tak:TryUpdateModel vs mocno wpisany parametr metody

[AcceptVerbs(HttpVers.Post)] 
public Create(Person newPerson) 
{ 
//code to update the person from the post 
} 

Ale teraz widzę tę nową drogę TryUpdateModel gdzie chciałbym tylko napisać coś takiego:

[AcceptVerbs(HttpVers.Post)] 
    public Create() 
    { 
     Person thePersonToCreate = new Person() 
     TryUpdateModel(thePersonToCreate) 
     { 
      //Code to create the person if model is valid 
     }  
    } 

Więc teraz wydaje muszę makiety HttpContext w celu przetestowania tej metody. Wydaje się jednak, że nadal mogę korzystać z tego pierwszego sposobu, używając silnie typowanych metod. Zdaję sobie sprawę, że metoda TryUpdateModel jest ulepszeniem dla tych, którzy używają metody FormCollection do robienia rzeczy, ale po co zawracać sobie głowę TryUpdateModel?

Odpowiedz

2

Istnieją przypadki, w których jest to pożądane. Dobrym przykładem jest wtedy, gdy twój model wymaga bardziej złożonej inicjalizacji lub metody fabryki do stworzenia.

[AcceptVerbs(HttpVers.Post)] 
public Create() 
{ 
    var dataAccess = new MyDataAccess("Another Param"); 
    Person thePersonToCreate = new Person(dataAccess); 

    TryUpdateModel(thePersonToCreate) 
    { 
     //Code to create the person if model is valid 
    }  
} 

Teraz można by argumentować, że zwyczaj ModelBinder jest lepszym rozwiązaniem tutaj, ale może być więcej wysiłku, niż jest wart, jeśli jest to jednorazowa sytuacja. Ponadto ukrywanie tego szczegółu w module ModelBinder utrudnia debugowanie błędów.

Są inne sytuacje, które jestem pewien, ale to tylko szybki przykład.

2

Niektóre również używają tej metody, gdy najpierw trzeba wczytać informacje do obiektu i połączyć wartości w celu sprawdzenia poprawności. Można jednak po prostu użyć automappera w tych przypadkach, ale niektóre firmy zakazują kodu open source.

Twierdzę, że prawie nikt nie używa FormCollection w dobrze zaprojektowanej aplikacji.