Pregunta

Estoy trabajando en una aplicación ASP.NET MVC2. Me he dado cuenta de una cosa muy sorprendente, sin embargo, sorprendente que MVC hace detrás de las escenas que tienen que ver con el modelo de unión y ModelState. Tengo un modelo de vista que tiene un montón de datos - algunos campos que forman parte de una forma mientras que otros son simplemente parte de la interfaz de usuario. En HttpPost, mi método utiliza la acción DefaultModelBinder la que se unen los intentos de todo el modelo, pero sólo los campos que eran parte del formulario se deserializan éxito - todos los demás siguen siendo nula. Eso está bien y comprensible. Si el ModelState no es válido, necesito actualización el modelo de la db y bind los campos de formulario particulares antes de regresar a la misma vista de edición para mostrar los errores de validación ModelState asociados.

Aquí es donde entra mi asombro y curiosidad. Fue mi suposición de que el fin para mí bind los campos de formulario con el modelo renovado, que tenía que hacer una llamada a cualquiera UpdateModel() o TryUpdateModel<>(), que pasa en el modelo recién renovado. Por ejemplo:

[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
    if (model.IsValid)
    {
        // Save the results to the db

        return RedirectToAction(...)
    }

    // Can't simply "return View(model)". Not all fields in EditDetailItemModel
    // were part of the form - thus they returned null. Have to refresh
    // model from the db.

    var refreshedModel = RefreshModelFromDB();

    // Is this line necessary?????
    TryUpdateModel<EditDetailItemModel>(refreshedModel);

    return View(refreshedModel);
}

Sin embargo, lo que encontré fue que si simplemente regresar refreshedModel a la vista sin hacer una llamada a TryUpdateModel<>(), el modelo renovado se enlaza automáticamente con los valores de campo de formulario publicado !! Por lo tanto, no es necesaria la TryUpdateModel<>() aquí!

La única manera de que pueda tener sentido de ello es que desde la ModelState está en un estado no válido, una vez que volví la vista con el modelo renovado, el "MVC motor de renderizado" en bucle a través de los errores ModelState y obligado esos valores de las propiedades con mi modelo renovado. Eso es simplemente increíble! Pero, quiero prueba en cuanto a esta suposición. No puedo encontrar documentación referente a esto en cualquier lugar en la web. Puede cualquier persona ya sea confirmar mi hipótesis de qué / cómo este comportamiento de enlace automáticos se está produciendo y / o educarme por qué / cómo está sucediendo, es de esperar una copia de seguridad con algunos enlaces de documentación en línea por lo que entiendo mejor lo que está pasando debajo de las sábanas?

¿Fue útil?

Solución

public ActionResult EditDetail(EditDetailItemModel model)

Esa línea llevará a cabo modelo de unión. Piense en los parámetros ActionMethod como siempre está poblado por una llamada a UpdateModel.

no está viendo los valores de refreshedModel en la vista, que está viendo las entradas y los valores de ModelState EditDetailItemModel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top