2011-09-14 11 views
65

Tengo una situación en la que estoy cargando una imagen que el usuario ha seleccionado de su sistema de archivos local. Mi formulario en mi opinión, básicamente tiene dos botones de envío. Uno se usa para enviar el formulario normalmente y se ejecuta toda la validación. El segundo es solo para cargar la imagen, en cuyo caso no quiero validar aún.MVC3 Eliminar errores de ModelState

me las arreglé para desactivar la validación del lado del cliente, dando mi 'Subir imagen' botón de enviar un valor a la clase de "style-name cancelar", por lo

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

Ahora, cuando envío de vuelta, mi modelo tiene una propiedad UploadImageButton, cuando se hace clic en este botón, rellena esta propiedad (el nombre de la entrada coincide con la propiedad). De esta forma, sé si el formulario fue enviado por mi verdadero botón Enviar o por UploadImageButton.

Mi pregunta es esta ... ¿Cómo puedo desactivar la validación de ServerSide? No deseo que aparezca la información del Resumen de validación cuando el usuario haga clic en este botón. Sé que usted puede añadir errores en el modelo personalizado utilizando este

Busco un medio para eliminar los errores del modelo. es posible?

EDIT:

Esto es lo que ocurrió:

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) { 
    //ModelState.Remove(key); //This was my solution before 
    ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak 
} 
+0

¿por qué haces un 'Donde (clave => ModelState.Keys.. Contiene (clave))? Parece que la cláusula Where es redundante, porque cada clave en ModelState.Keys tendrá su ModelState.Keys.Contains (key) return true. –

+1

He actualizado la pregunta y el texto, para usar el método más corto en el ModelState.ContainsKey, aunque está equivocado en su suposición. Estos están haciendo lo mismo. –

+0

Lo siento, es posible que haya explicado mal o malinterpretado su respuesta. Tiene razón en que 'ModelState.ContainsKey (clave)' y 'ModelState.Contains (key)' hacen lo mismo, pero mi punto es que todos los valores en 'ModelState.Keys.ToList()' serán por naturaleza contenidos en 'ModelState', por lo que toda la cláusula' Where' es redundante y ralentizará el rendimiento. Una cosa menor, sin embargo. –

Respuesta

116

Puede eliminar errores en el modelo haciendo algo como esto:

if (ModelState.ContainsKey("{key}")) 
    ModelState["{key}"].Errors.Clear(); 
+1

Esto es exactamente lo que estaba buscando. Cambié mi respuesta seleccionada (lo siento Adam Tuliper). –

+0

¡Gracias, eso me ahorró un par de horas! – Agent007

+0

Por si acaso alguien se preguntaba, esto también afecta 'ModelState.IsValid' –

55

Esto construye fuera de las respuestas anteriores, pero lo simplifica un poco más:

foreach (var modelValue in ModelState.Values) 
{ 
    modelValue.Errors.Clear(); 
} 
6

En general, no desea desactivar la validación del lado del servidor o eliminar manualmente los errores de ModelState. Es factible, pero propenso a errores, ya que debe confiar en las cadenas como claves. Volví a subir la respuesta sobre cómo quitar las llaves, porque es correcta y útil, pero recomiendo no diseñar un caso en el que debes considerarlo con firmeza.

En su caso, tiene varios botones de envío para el mismo formulario, pero realmente no está enviando el formulario cuando carga la imagen. Para evitar la validación del lado del cliente, puede usar la clase "cancelar" como ya ha indicado, pero también recomiendo tener el segundo botón de envío en una forma diferente, en cuyo caso no causa ninguna validación en su formulario principal.

Existe una segunda ventaja con el uso del formulario diferente: puede enviarlo a un método ActionResult diferente que simplemente manejaría la lógica de carga de la imagen. Este método diferente simplemente no se molestaría en verificar la propiedad "IsValid" del estado del modelo: solo le importa si hay información en la imagen, y eso se puede verificar por separado. (Incluso si usa el mismo método ActionResult, puede canalizar la lógica para que no confíe en la propiedad IsValid del estado del modelo).

Si debe borrar los errores del estado del modelo, y lo hace sentido para borrar todos ellos, intente esto:

foreach (var key in ModelState.Keys) 
{ 
    ModelState[key].Errors.Clear(); 
} 

esto le impide conseguir dependiendo de los nombres clave correcta, pero conserva los valores ya deberían existir ningún valor (válidos o no válidos) en el modelo.

Una última cosa que debes comprobar en estos casos es si tienes valores que solo algunas veces están en la vista, lo que no provocará la validación del lado del cliente (no están en la vista), pero sí problemas de validación lateral. En este caso, es mejor utilizar @ Html.HiddenFor (model => model.PropertyName, si puede, suponiendo que el valor ya se ha configurado, simplemente no es visible en esta vista.

4

Lo uso a veces , así que he hecho un método de extensión fuera de él:

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName) 
{ 
    if (m.ContainsKey(fieldName)) 
     m[fieldName].Errors.Clear(); 
    return m; 
} 

se puede utilizar con soltura para borrar el error para múltiples campos

Cuestiones relacionadas