Tengo una acción simple de ASP.NET MVC como esta:
public ActionResult Edit(EditPostViewModel data)
{
}
El EditPostViewModel
tener los atributos de validación de esta manera:
[Display(Name = "...", Description = "...")]
[StringLength(100, MinimumLength = 3, ErrorMessage = "...")]
[Required()]
public string Title { get; set; }
En la vista, estoy usando los siguientes ayudantes:
@Html.LabelFor(Model => Model.EditPostViewModel.Title, true)
@Html.TextBoxFor(Model => Model.EditPostViewModel.Title,
new { @class = "tb1", @Style = "width:400px;" })
Si hago un envío en un formulario que este cuadro de texto se coloca en una validación se realizará primero en el cliente y luego en el servicio ( ModelState.IsValid
).
Ahora tengo un par de preguntas:
¿Se puede usar esto con jQuery ajax submit en su lugar? Lo que estoy haciendo es simplemente eliminar el formulario y al hacer clic en el botón enviar, un javascript recopilará datos y luego ejecutará el archivo
$.ajax
.¿Funcionará el lado del servidor
ModelState.IsValid
?¿Cómo puedo reenviar el problema de validación al cliente y presentarlo como si estuviera usando build int validation (
@Html.ValidationSummary(true)
)?
Ejemplo de llamada Ajax:
function SendPost(actionPath) {
$.ajax({
url: actionPath,
type: 'POST',
dataType: 'json',
data:
{
Text: $('#EditPostViewModel_Text').val(),
Title: $('#EditPostViewModel_Title').val()
},
success: function (data) {
alert('success');
},
error: function () {
alert('error');
}
});
}
Edición 1:
Incluido en la página:
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>
fuente
Respuestas:
Lado del cliente
Usar la
jQuery.validate
biblioteca debería ser bastante simple de configurar.Especifique la siguiente configuración en su
Web.config
archivo:Cuando construya su vista, definiría cosas como esta:
NOTA: Estos deben definirse dentro de un elemento de formulario.
Entonces necesitaría incluir las siguientes bibliotecas:
Esto debería poder configurarlo para la validación del lado del cliente
Recursos
Lado del servidor
NOTA: Esto es solo para validación adicional del lado del servidor en la parte superior de la
jQuery.validation
biblioteca.Quizás algo como esto podría ayudar:
Donde
ValidateAjax
es un atributo definido como:Lo que hace es devolver un objeto JSON que especifica todos los errores de su modelo.
La respuesta de ejemplo sería
Esto se devolverá a su error al manejar la devolución de llamada de la
$.ajax
llamadaPuede recorrer los datos devueltos para configurar los mensajes de error según sea necesario en función de las claves devueltas (creo que algo como
$('input[name="' + err.key + '"]')
encontraría su elemento de entradafuente
for (var i = 0; i < modelStateErrors.length; i++) { $('span[data-valmsg-for="' + modelStateErrors[i].key + '"]').text(modelStateErrors[i].errors[0]); }
Lo que debe hacer es serializar los datos de su formulario y enviarlos a la acción del controlador. ASP.NET MVC vinculará los datos del formulario al
EditPostViewModel
objeto (su parámetro de método de acción), utilizando la función de vinculación del modelo MVC.Puede validar su formulario en el lado del cliente y si todo está bien, envíe los datos al servidor. los
valid()
método te resultará útil.fuente
Aquí tienes una solución bastante simple:
En el controlador devolvemos nuestros errores así:
Aquí hay algunos de los guiones del cliente:
Así es como lo manejamos a través de ajax:
Además, renderizo vistas parciales a través de ajax de la siguiente manera:
Método RenderRazorViewToString:
fuente
PartialView
render a Ajax?Se agregó un poco más de lógica a la solución proporcionada por @Andrew Burgess. Aquí está la solución completa:
Creó un filtro de acción para obtener errores para la solicitud ajax:
Agregué el filtro a mi método de controlador como:
Se agregó un script común para la validación de jquery:
Finalmente agregué el método de error javascript a mi formulario Ajax Begin:
fuente
Puedes hacerlo de esta manera:
( Editar: considerando que estás esperando una respuesta
json
condataType: 'json'
).RED
JS:
Si lo necesita, también puedo explicar cómo hacerlo devolviendo un error 500 y obteniendo el error en el evento error (ajax). Pero en tu caso esta puede ser una opción
fuente