2011-03-11 26 views

Respuesta

44

Puede utilizar este método para actualizar el modelo que respalda una vista particular a través del controlador dado. Por ejemplo, si tengo una vista que muestra un objeto Foo con Barra de propiedades poblada por un cuadro de texto, puedo llamar a un método Guardar() en el controlador y llamar a TryUpdateModel para intentar actualizar el Foo.

public class Foo { 
    public string Bar { get; set; } 
} 

// ... in the controller 
public ActionResult Save() { 
    var myFoo = new Foo(); 
    TryUpdateModel(myFoo); 
} 

Esto intentará actualizar el modelo con el valor dado para la barra. Si la actualización falla la validación (por ejemplo, esa barra era un número entero y el cuadro de texto tenía el texto "hola"), TryUpdateModel pasará la actualización de ViewData ModelState con errores de validación y su vista mostrará los errores de validación.

Asegúrese de prestar mucha atención a la advertencia de seguridad para .NET Framework 4 en la documentación de MSDN:

Nota de seguridad Utilice una de las [sobrecarga: System.Web.Mvc.Controller. TryUpdateModel``1] métodos que toman una lista de propiedades para incluir (una lista blanca) o una lista de propiedades para excluir (una lista negra ). Si no hay lista blanca o negra explícita se pasa, el [sobrecarga: System.Web.Mvc.Controller.TryUpdateModel`1] método intenta actualizar todos los propiedad pública en el modelo para la que no es un valor correspondiente en la solicitud. Un usuario malintencionado podría explotar esto para actualizar propiedades a las que no tiene intención de dar acceso .

https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryupdatemodel(v=vs.100).aspx

+11

+1 para incluir la advertencia de seguridad sobre la asignación masiva. Esta vulnerabilidad es común a la mayoría de los frameworks MVC, y es lo que permitió que GitHub fuera creado (http://www.extremetech.com/computing/120981-github-hacked-millions-of-projects-at-risk-of-being- modified-or-deleted). –

+1

Esa vulnerabilidad también se aplica cuando no usa TryUpdateModel. También puede especificar una lista blanca: public ActionResult ActionName ([Bind (Include = "FieldName"] Model) o una lista negra public ActionResult ActionName ([Bind (Exclude = "FieldName"] Model) cuando no confía en TryUpdateModel http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx – Rui

16

TryUpdateModel() le permite enlazar parámetros para el modelo dentro de su acción. Esto es útil si desea cargar su modelo desde una base de datos y luego actualizarlo en función de la entrada del usuario en lugar de tomar todo el modelo de la entrada del usuario.

public ActionResult Update(int id) { 
    var service = new ServiceClass(); 
    var record = service.LoadModel(id); 
    if (!TryUpdateModel(record)) { 
     // There was an error binding data 
     return View(); 
    } 
    // Everything was ok, now save the record back to the database 
    service.SaveModel(record); 
    return View("Success"); 
} 

Funciona de manera similar a UpdateModel() a este respecto, pero devuelve verdadero y falso en caso de éxito si hay un error. UpdateModel() arroja una excepción si hay un error que requiere un poco más de código.

Nota: Es posible que desee utilizar una de las sobrecargas que le permite límite de las propiedades que se pueden actualizar.

12

Se utilizó, además de evitar TryUpdateModel Modelo mágica unión antes de la acción se llama; en cambio tomamos un HttpFormCollection como nuestro parámetro y llamamos al TryUpdateModel dentro del método. El valor booleano limpio devuelto por este flujo de control permitido pasará a un método Correcto o Incorrecto para la Acción. p.ej.

public ActionResult Save(HttpFormCollection formCollection) 
{ 
    var saveModel = new SaveModel(); // or from a Factory etc 
    var validModel = TryUpdateModel(_saveModel, formCollection); // order may be incorrect 
    return validModel ? Save(saveModel) : InvalidSaveModel(saveModel); 
} 

nos pareció bastante fácil construir un HttpFormCollection para todos nuestros casos de validación y, por tanto, comprobar la acción.

Cuestiones relacionadas