Me preguntaba si es posible deshabilitar el atributo de validación requerida en ciertas acciones del controlador. Me pregunto esto porque en uno de mis formularios de edición no requiero que el usuario ingrese valores para los campos que ya han especificado previamente. Sin embargo, luego implemento la lógica de que cuando ingresan un valor, utiliza una lógica especial para actualizar el modelo, como el hash de un valor, etc.
¿Alguna sugerencia sobre cómo solucionar este problema?
EDITAR:
Y sí, la validación del cliente es un problema aquí, ya que no les permitirá enviar el formulario sin ingresar un valor.
c#
asp.net-mvc
asp.net-mvc-3
data-annotations
Alex Hope O'Connor
fuente
fuente
RequiredAttr
completo y hacer una verificación del lado del servidor cuando sea necesario. Pero esto sería complicado para el clienteRespuestas:
Este problema se puede resolver fácilmente mediante el uso de modelos de vista. Los modelos de vista son clases que se adaptan específicamente a las necesidades de una vista determinada. Entonces, por ejemplo, en su caso, podría tener los siguientes modelos de vista:
que se utilizarán en sus acciones de controlador correspondientes:
fuente
Update(FormCollection collection)
, al menos yo nunca. Siempre definir y utilizar una vista de modelo específica:Update(UpdateViewView model)
.Insert
. Gracias por señalar esto.Si solo desea deshabilitar la validación para un solo campo en el lado del cliente, puede anular los atributos de validación de la siguiente manera:
fuente
@Html.TexBoxFor(model => model.SomeValue, new { data_val = false })
- Más fácil de leer IMO.$(".search select").attr('data-val', false);
Sé que esta pregunta ha sido respondida hace mucho tiempo y la respuesta aceptada realmente hará el trabajo. Pero hay una cosa que me molesta: tener que copiar 2 modelos solo para deshabilitar una validación.
Aquí está mi sugerencia:
De esta manera, no tiene que molestarse con las validaciones del lado del cliente / servidor, el marco se comportará de la manera que se supone que debe hacerlo. Además, si define un
[Display]
atributo en la clase base, no tiene que redefinirlo en suUpdateModel
.Y aún puede usar estas clases de la misma manera:
fuente
Puede eliminar toda la validación de una propiedad con lo siguiente en la acción de su controlador.
Comentario de @ Ian sobre MVC5
Lo siguiente todavía es posible
Es un poco molesto que pierdas la escritura estática con la API actualizada. Puede lograr algo similar a la forma anterior creando una instancia de ayuda HTML y utilizando métodos NameExtensions .
fuente
ModelState
que coincida con esa firma. No en MVC 5, al menos.Lado del cliente Para deshabilitar la validación de un formulario, a continuación se ofrecen múltiples opciones basadas en mi investigación. Uno de ellos con suerte trabajaría para usted.
Opción 1
Prefiero esto, y esto funciona perfectamente para mí.
e invocándolo como
opcion 2
Opción 3
Opcion 4
Opción 5
Lado del servidor
Cree un atributo y marque su método de acción con ese atributo. Personalice esto para adaptarlo a sus necesidades específicas.
Aquí se describe un mejor enfoque Habilitar / Deshabilitar la validación del lado del servidor mvc dinámicamente
fuente
Personalmente, tendería a utilizar el enfoque que mostró Darin Dimitrov en su solución. Esto le permite utilizar el enfoque de anotación de datos con validación Y tener atributos de datos separados en cada ViewModel correspondiente a la tarea en cuestión. Para minimizar la cantidad de trabajo para copiar entre el modelo y el modelo de vista, debe mirar AutoMapper o ValueInjecter . Ambos tienen sus puntos fuertes individuales, así que verifíquelos.
Otro enfoque posible para usted sería derivar su modelo o modelo de vista de IValidatableObject. Esto le da la opción de implementar una función Validar. Al validar, puede devolver una Lista de elementos de ValidationResult o emitir un rendimiento para cada problema que detecte en la validación.
ValidationResult consta de un mensaje de error y una lista de cadenas con los nombres de campo. Los mensajes de error se mostrarán en una ubicación cerca de los campos de entrada.
fuente
Creo que la forma más limpia aquí será deshabilitar la validación del lado del cliente y en el lado del servidor deberá:
Parece que incluso un modelo de vista personalizada aquí no resolverá el problema porque el número de esos campos 'pre respondidos' podría variar. Si no lo hacen, un modelo de vista personalizada puede ser la forma más fácil, pero utilizando la técnica anterior puede solucionar sus problemas de validación.
fuente
esta fue la respuesta de otra persona en los comentarios ... pero debería ser una respuesta real:
$("#SomeValue").removeAttr("data-val-required")
probado en MVC 6 con un campo que tiene el
[Required]
atributorespuesta robada de https://stackoverflow.com/users/73382/rob arriba
fuente
Estaba teniendo este problema cuando creé una vista de edición para mi modelo y quiero actualizar solo un campo.
Mi solución para una forma más simple es poner los dos campos usando:
Comentarios es el campo que solo actualizo en la Vista de edición, que no tiene el Atributo requerido.
ASP.NET MVC 3 Entity
fuente
AFAIK no puede eliminar el atributo en tiempo de ejecución, sino que solo cambia sus valores (es decir: solo lectura verdadero / falso) busque aquí algo similar . Como otra forma de hacer lo que quiere sin jugar con los atributos, iré con un ViewModel para su acción específica para que pueda insertar toda la lógica sin romper la lógica que necesitan otros controladores. Si intenta obtener algún tipo de asistente (un formulario de varios pasos), puede serializar los campos ya compilados y con TempData los llevará a lo largo de sus pasos. (para obtener ayuda en serializar deserializar puede usar futuros MVC )
fuente
Lo que dijo @Darin es lo que recomendaría también. Sin embargo, agregaría (y en respuesta a uno de los comentarios) que, de hecho, también puede usar este método para tipos primitivos como bit, bool, incluso estructuras como Guid simplemente haciéndolos anulables. Una vez que haga esto, el
Required
atributo funciona como se esperaba.fuente
A partir de MVC 5, esto se puede lograr fácilmente agregando esto en su
global.asax
.fuente
Estaba buscando una solución donde pueda usar el mismo modelo para una inserción y actualización en la API web. En mi situación, esto es siempre un contenido corporal. Los
[Requiered]
atributos deben omitirse si se trata de un método de actualización. En mi solución, coloca un atributo[IgnoreRequiredValidations]
sobre el método. Esto es lo siguiente:¿Qué más hay que hacer? Se debe crear y agregar un propio BodyModelValidator al inicio. Esto está en la HttpConfiguration y se ve así:
config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
Mi propio BodyModelValidator se deriva del DefaultBodyModelValidator. Y me di cuenta de que tenía que anular el método 'ShallowValidate'. En esta anulación, filtro los validadores de modelo requeridos. Y ahora la clase IgnoreRequiredOrDefaultBodyModelValidator y la clase de atributo IgnoreRequiredValidations:
Fuentes:
string debug = new StackTrace().ToString()
para averiguar quién está manejando la validación del modelo.fuente
Si no desea utilizar otro ViewModel, puede deshabilitar las validaciones de clientes en la vista y también eliminar las validaciones en el servidor para aquellas propiedades que desea ignorar. Consulte esta respuesta para obtener una explicación más profunda https://stackoverflow.com/a/15248790/1128216
fuente
En mi caso, se utilizó el mismo modelo en muchas páginas para fines de reutilización. Entonces, lo que hice fue crear un atributo personalizado que verifica las exclusiones
y en tu controlador
Digamos que el modelo es
fuente
Sí, es posible deshabilitar el atributo requerido. Cree su propio atributo de clase personalizado (código de muestra llamado ChangeableRequired) en extensión desde RequiredAtribute y agregue una Propiedad deshabilitada y anule el método IsValid para verificar si está desbalanceado. Use la reflexión para establecer la propiedad deshabilitada, así:
Atributo personalizado:
Actualice su propiedad para usar su nuevo atributo personalizado:
donde necesita deshabilitar la propiedad, use la reflexión para establecerla:
Esto se siente bien y limpio?
NB: la validación anterior se deshabilitará mientras su instancia de objeto esté viva \ activa ...
fuente