visual tutorial studio que paginas pages net mvc instalar español asp asp.net-mvc asp.net-mvc-3 unobtrusive-validation asp.net-mvc-4

asp.net-mvc - tutorial - razor pages que es



¿Revalidar un ViewModel modificado dentro de un método de controlador? (2)

EDITAR - Estamos usando MVC4 Dev Preview ...

Estoy implementando una página de edición para una clase FishingTrip . FishingTrip contiene una colección de elementos triples simples (es decir, FishingTripID, CrewID, CrewPosition).

Estoy utilizando el enfoque de Jarrett Meyer para agregar, editar y eliminar de la colección Crew . Estoy usando una validación discreta para especificar que las propiedades de Crew son Required .

Mi problema: cuando, lógicamente, elimino un elemento de la lista (según el método de Jarrett), no quiero que ese elemento sea validado.

He modificado correctamente el método "removeRow" en el lado del cliente para desactivar la validación discreta del elemento eliminado lógicamente, de modo que el formulario se publique a pesar de que haya un elemento que contenga campos en blanco.

En mi método de controlador [HttpPost] Edit , ModelState.IsValid comienza como falso (como se esperaba, debido al elemento eliminado lógicamente que contiene campos en blanco). Por lo tanto, elimino ese elemento de mi ViewModel .... pero ModelState.IsValid es sigue siendo falso

En resumen, yo (creo que) quiero modificar mi ViewModel dentro del método del controlador para eliminar el elemento ofensivo, luego llamar a algún tipo de "revalidar" y hacer que ModelState.IsValid aparezca como verdadero.

¿Algunas ideas?


Tarde en el juego, pero aún así: también estaba buscando una forma de validar el modelo después de hacer algunos ajustes (más precisamente, a los elementos de su colección anidada) y TryValidateModel no funcionó para mí, ya que no funciona t procesa objetos anidados.

Finalmente, resolví con una carpeta de modelo personalizada:

public class MyItemModelBinder : DefaultModelBinder { protected override void OnModelUpdated( ControllerContext controllerContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType == typeof(MyItemModel)) { MyItemModel item = (MyItemModel)bindingContext.Model; //do required tweaks on model here //(I needed to load some additional data from DB) } //validation code will be called here, in OnModelUpdated implementation base.OnModelUpdated(controllerContext, bindingContext); } }

en la clase de modelo:

[ModelBinder(typeof(MyItemModelBinder))] public class MyItemModel : IValidatableObject { //... }


Una vez que haya eliminado los elementos ofensivos, borre el estado del modelo y valide de nuevo, de esta manera:

ModelState.Clear(); TryValidateModel(crew); // assumes the model being passed is named "crew"

Nota : Tenga cuidado cuando use el método TryValidateModel porque este método no valida el objeto anidado del modelo (como lo menciona @Merenzo).