Exemple:
Modèle:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
}
Manette:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
Vue:
@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" />
}
et voici un meilleur exemple (à mon avis):
Vue:
@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;
});
});
qui peut être encore amélioré avec le plugin de formulaire jQuery .
Je pense que toutes les réponses ont manqué un point crucial:
Si vous utilisez le formulaire Ajax pour qu'il doive se mettre à jour lui-même (et NON un autre div en dehors du formulaire), vous devez placer le div contenant à l' extérieur du formulaire. Par exemple:
Sinon, vous finirez comme @David où le résultat est affiché dans une nouvelle page.
la source
UnobtrusiveJavaScriptEnabled
à vrai nulle partJ'ai finalement réussi à faire fonctionner la solution de Darin, mais j'ai d'abord fait quelques erreurs, ce qui a entraîné un problème similaire à David (dans les commentaires ci-dessous, la solution de Darin), où le résultat était publié sur une nouvelle page.
Parce que je devais faire quelque chose avec le formulaire après le retour de la méthode, je l'ai stocké pour une utilisation ultérieure:
Cependant, cette variable n'avait pas les propriétés "action" ou "méthode" qui sont utilisées dans l'appel ajax.
Au lieu de cela, vous devez utiliser la variable "this":
la source
jQuery
objet avec formulaire comme sélecteur.form[0]
aurait les propriétés. Il est également recommandé de préfixer toutes lesjQuery
variables$
pour les identifier plus facilement.La solution de Darin Dimitrov a fonctionné pour moi à une exception près. Lorsque j'ai soumis la vue partielle avec des erreurs de validation (intentionnelles), j'ai fini par retourner des formulaires en double dans la boîte de dialogue:
Pour résoudre ce problème, j'ai dû envelopper le Html.BeginForm dans une div:
Lorsque le formulaire a été soumis, j'ai effacé le div dans la fonction de réussite et sorti le formulaire validé:
la source
Partial Views
pour rendre la fonction de création sous la page d'index. Je peux obtenir tous les messages de validation dans la vue partielle. Mais lorsque leCreate
réussit, l'index s'affiche deux fois. Je n'ai aucunHtml.BeginForm
dans ma vue d'index.UpdateTargetId = "myForm"
placeSi aucune validation de données n'est exécutée ou si le contenu est toujours renvoyé dans une nouvelle fenêtre, assurez-vous que ces 3 lignes sont en haut de la vue:
la source
Exemple
// Dans le modèle
// Dans PartailView //PartailView.cshtml
Dans la vue Index.cshtml
Dans le contrôleur
vous devez passer ViewName et Model à la méthode RenderPartialViewToString. il vous renverra la vue avec validation à laquelle vous êtes appliqué dans le modèle et ajoutera le contenu dans "targetId" div dans Index.cshtml. De cette façon, en attrapant RenderHtml de vue partielle, vous pouvez appliquer la validation.
la source
Les formulaires Ajax fonctionnent de manière asynchrone en utilisant Javascript. Il est donc nécessaire de charger les fichiers de script pour exécution. Même s'il s'agit d'un petit compromis sur les performances, l'exécution se produit sans publication.
Nous devons comprendre la différence entre les comportements des formulaires Html et Ajax.
Ajax:
Ne redirige pas le formulaire, même si vous effectuez une RedirectAction ().
Effectue la sauvegarde, la mise à jour et toute opération de modification de manière asynchrone.
Html:
Redirigera le formulaire.
Effectue des opérations à la fois de manière synchrone et asynchrone (avec un peu de code et d'attention supplémentaires).
Démontré les différences avec un POC dans le lien ci-dessous. Lien
la source
Avant d'ajouter Ajax.BeginForm. Ajoutez les scripts ci-dessous à votre projet dans l'ordre indiqué,
Seuls ces deux sont suffisants pour effectuer une opération Ajax.
la source