2010-01-28 22 views
8

Actualmente estoy desarrollando una aplicación con el nuevo marco ASP.NET MVC2. Originalmente comencé a escribir esta aplicación en ASP.NET MVC1 y básicamente estoy actualizándola a MVC2.Forma correcta de usar FormCollection en ASP.NET MVC2 Crear método?

Mi problema aquí es que realmente no entiendo el concepto del objeto FormCollection frente al antiguo objeto Typed.

Este es mi código actual:

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

Este es el código de la aplicación 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)); 
} 

¿Cuáles son los beneficios de cambiar a FormCollection en MVC2 y lo más importante - ¿cómo es usado correctamente?

+0

No veo ninguno, ¿está roto el viejo modelo? ¿Por qué cambiar? – mxmissile

+0

No, no está roto ... parecía que el antiguo modelo fuertemente tipado se abandonó ya que los nuevos Controladores vienen con un FormCollection en lugar de un objeto muy tipado. –

Respuesta

11

También tenía el objeto FormCollection en v1. Pero es más preferido usar un objeto tipeado. Entonces, si ya está haciendo eso, continúe haciéndolo.

+1

+1 Sí, FormCollection ha estado allí desde el principio. Si no está roto, ¡no lo arregles! –

0

Al usar FormCollection, termina manualmente haciendo coincidir sus datos de publicación o clave/valores de cadena de consulta en valores para usar en su código usando tipado de cadena (resultando en código de tipo de letra), cuando en su lugar, el Enlace de modelo incorporado puede haga esto por usted si usa modelos de formulario, también conocidos como "objetos tipeados".

Creo que al utilizar FormCollection, también es probable que también pierda la posibilidad de utilizar los útiles atributos de anotación de datos (validación de barra diagonal) en los objetos de su modelo diseñados para el encuadernado con modelos de objetos.

Además, las pruebas unitarias pueden ser mucho más engorrosas una vez que empiezas a tocar el controlador. Request.Form. Puede que tenga que burlarse y configurar una HttpContextBase y una HttpRequestBase para que la propiedad .Form de esa solicitud simulada devuelva la NameValueCollection que desea que su prueba vea. Esto contrasta con la unión dejando modelo de hacer el trabajo para usted, tales como:

// Arrange 
    var myModel = new MyModel(Property1 = "value1", Property2 = "value2"); 
    // Act 
    var myResult = myController.MyActionMethod(myModel); 
    // Assert 
    // whatever you want the outcome to be 

En resumen, recomendaría contra el uso de FormCollection en la mayor medida posible.

Cuestiones relacionadas