2009-07-06 19 views
24

Estoy trabajando en mi primera aplicación .NET MVC y utilizando el tutorial NerdDinner como punto de referencia. Un punto que me intriga en este momento es el método UpdateModel(). (No me gusta usar cosas que no entiendo muy bien.)¿Cómo funciona el método ASP.NET MVC UpdateModel()?

tomada de la NerdDinner tutorial -

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    UpdateModel(dinner); 

    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = dinner.DinnerID }); 
} 

Mi pregunta principal es ¿Cómo funciona el UpdateModel() consigue el acceso a los formValues ​​aprobadas en el método de edición ? ¿Por qué la colección no se transmite explícitamente como un parámetro del método?

+0

Me gustaría obtener el [fuente ASP.NET MVC] (http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en) de Microsoft, y usar eso para recorrer tu código. A continuación, podrá ver exactamente qué magia están haciendo :-) – mkchandler

+0

, ¿funcionará solo para el escenario de recopilación de formularios u otro? – Krish

Respuesta

3

Inspecciona todas las entradas HttpRequest como las variables Form, QueryString, Cookies y Server. Yo pienso en este orden

+0

'UpdateModel Function' solo funcionará para el escenario de recopilación de formularios u otro también? – Krish

24

UpdateModel() es un método controlador que intenta vincular varios orígenes de datos de entrada (HTTP POST data from a View, QueryString values, Session variables/Cookies, etc.) al objeto modelo explícito que usted indica como un parámetro. Básicamente, es solo para encuadernación de modelo.

Si expresa los parámetros de entrada para su Acción como un modelo fuertemente tipado (como un Modelo de vista), ya ha realizado todos los pasos que se realizan detrás de las escenas cuando se llama a UpdateModel(). Si recupera un objeto del DataContext y edita sus propiedades, SaveChanges() es todo lo que necesita para volver a enviar las actualizaciones a la base de datos (en este caso, Save()).

Ejemplo:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    dinner.Description = incoming.Description; 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

Sin embargo, hay un caso de uso para el uso de UpdateModel() con un modelo inflexible de tipos: cuando se está de paso en un modelo de establecimiento inflexible y quiere sus valores a reemplazar directamente los de una entidad de la base de datos (siempre que todos sean nombrados y mecanografiados de la misma manera). En este caso, recuperaría el objeto, usaría UpdateModel() en él, y su operación de vinculación del modelo extraerá cualquier propiedad similarmente tipada del objeto fuertemente tipado al objeto recuperado. En otras palabras, realizará reflejo para usted.

Por lo tanto, como su ejemplo, si quiere que todas las propiedades se actualicen sin especificar cuál actualizar, y su modelo de base de datos y modelo fuertemente definido tiene propiedades con nombres similares, aún desea usar UpdateModel() para aprovechar de la reflexión

Ejemplo:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    UpdateModel(dinner); 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

La única ventaja aquí (sobre el uso de un objeto FormCollection) es que usted tendría acceso a todas las demás propiedades del objeto inflexible de tipos (como se muestra por incoming.DinnerID).

Conclusión: si está traduciendo un objeto fuertemente tipado a un objeto derivado, probablemente sea más fácil usar UpdateModel(). Sin embargo, es innecesario en gran medida si simplemente está actualizando algunas propiedades del objeto derivado. Además, tenga en cuenta que el uso de Entity Framework (en lugar de algo como Linq to SQL) hace que todo esto sea discutible, ya que puede relacionar objetos fuertemente tipificados y objetos derivados con sus propios métodos.

+0

'UpdateModel Function' solo funcionará para el escenario de colección de formularios u otro? – Krish

Cuestiones relacionadas