Ejemplo:
Modelo:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
}
Controlador:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
Ver:
@model AppName.Models.MyViewModel
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<div id="result"></div>
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "result" }))
{
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
y aquí hay un mejor ejemplo (en mi perspectiva):
Ver:
@model AppName.Models.MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/index.js")" type="text/javascript"></script>
<div id="result"></div>
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
index.js
:
$(function () {
$('form').submit(function () {
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('#result').html(result);
}
});
}
return false;
});
});
que se puede mejorar aún más con el complemento de formulario jQuery .
Creo que todas las respuestas perdieron un punto crucial:
Si se utiliza el formulario Ajax por lo que tiene que actualizarse (y no otro div exterior de la forma), entonces usted necesita para poner el div que contiene FUERA de la forma. Por ejemplo:
De lo contrario, terminará como @David donde el resultado se muestra en una nueva página.
fuente
UnobtrusiveJavaScriptEnabled
a la verdad en ninguna parteFinalmente conseguí que la solución de Darin funcionara, pero primero cometí algunos errores que resultaron en un problema similar a David (en los comentarios debajo de la solución de Darin) donde el resultado se publicaba en una nueva página.
Debido a que tuve que hacer algo con el formulario después de que el método regresó, lo almacené para su uso posterior:
Sin embargo, esta variable no tenía las propiedades "acción" o "método" que se utilizan en la llamada ajax.
En su lugar, debe usar la variable "this":
fuente
jQuery
objeto con el formulario como selector.form[0]
tendrían las propiedades. También es una buena práctica prefijar cualquierjQuery
variable$
para identificarla más fácilmente.La solución de Darin Dimitrov funcionó para mí con una excepción. Cuando envié la vista parcial con errores de validación (intencionales), terminé devolviendo formularios duplicados en el cuadro de diálogo:
Para solucionar esto, tuve que envolver el Html.BeginForm en un div:
Cuando se envió el formulario, borré el div en la función de éxito y envié el formulario validado:
fuente
Partial Views
para representar la función de creación debajo de la página de índice. Puedo obtener todos los mensajes de validación en la Vista parcial. Pero cuandoCreate
es exitoso, el índice se muestra dos veces. No tengoHtml.BeginForm
en mi Vista de índice.UpdateTargetId = "myForm"
lugarSi no se realizó ninguna validación de datos, o el contenido siempre se devuelve en una nueva ventana, asegúrese de que estas 3 líneas estén en la parte superior de la vista:
fuente
Ejemplo
// En modelo
// En PartailView //PartailView.cshtml
En la vista Index.cshtml
En el controlador
debe pasar ViewName y Model al método RenderPartialViewToString. le devolverá la vista con la validación que está aplicando en el modelo y agregará el contenido en "targetId" div en Index.cshtml. De esta manera, al capturar RenderHtml de vista parcial, puede aplicar la validación.
fuente
Los formularios Ajax funcionan de forma asíncrona usando Javascript. Por lo tanto, es obligatorio cargar los archivos de script para su ejecución. Aunque es un pequeño compromiso de rendimiento, la ejecución se realiza sin devolución de datos.
Necesitamos entender la diferencia entre los comportamientos de los formularios Html y Ajax.
Ajax:
No redirigirá el formulario, incluso si realiza una Acción de redireccionamiento ().
Realizará operaciones de guardado, actualización y modificación de forma asincrónica.
HTML:
Redirigirá el formulario.
Realizará operaciones tanto sincrónicamente como asincrónicamente (con un código adicional y cuidado).
Demostró las diferencias con un POC en el siguiente enlace. Enlace
fuente
Antes de agregar el Ajax.BeginForm. Agregue los siguientes scripts a su proyecto en el orden mencionado,
Solo estos dos son suficientes para realizar la operación Ajax.
fuente