Przykład:
Model:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
}
Kontroler:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
Widok:
@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" />
}
a oto lepszy (z mojej perspektywy) przykład:
Widok:
@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;
});
});
które można dodatkowo ulepszyć za pomocą wtyczki jQuery .
Myślę, że wszystkie odpowiedzi pominęły kluczowy punkt:
Jeśli używasz formularza Ajax, aby musiał się zaktualizować (a NIE inny div poza formularzem), musisz umieścić div zawierający NA ZEWNĄTRZ formularza. Na przykład:
W przeciwnym razie skończysz jak @David, gdzie wynik jest wyświetlany na nowej stronie.
źródło
UnobtrusiveJavaScriptEnabled
nigdzie się nie ustawiłemW końcu udało mi się uruchomić rozwiązanie Darina, ale najpierw popełniłem kilka błędów, co spowodowało problem podobny do Davida (w komentarzach poniżej rozwiązania Darina), gdzie wynik był publikowany na nowej stronie.
Ponieważ po zwróceniu metody musiałem coś zrobić z formularzem, zapisałem go do późniejszego użycia:
Jednak ta zmienna nie miała właściwości „action” ani „method”, które są używane w wywołaniu ajax.
Zamiast tego musisz użyć zmiennej „this”:
źródło
jQuery
obiektem z formą jako selektorem.form[0]
miałby właściwości. Dobrą praktyką jest także prefiksowanie dowolnychjQuery
zmiennych w$
celu łatwiejszego ich identyfikowania.Rozwiązanie Darina Dimitrowa działało dla mnie z jednym wyjątkiem. Kiedy przesłałem widok częściowy z (celowymi) błędami weryfikacji, w oknie dialogowym zwrócono duplikaty formularzy:
Aby to naprawić musiałem zawinąć Html.BeginForm w div:
Po przesłaniu formularza wyczyściłem div w funkcji powodzenia i wyprowadziłem zweryfikowany formularz:
źródło
Partial Views
do renderowania funkcji tworzenia poniżej strony indeksu. Mogę uzyskać wszystkie komunikaty sprawdzania poprawności w częściowym widoku. Ale gdy sięCreate
powiedzie, indeks jest wyświetlany dwukrotnie. Nie mamHtml.BeginForm
w widoku indeksu.UpdateTargetId = "myForm"
zamiast tegoJeśli nie sprawdzono sprawdzania poprawności danych lub treść jest zawsze zwracana w nowym oknie, upewnij się, że te 3 wiersze znajdują się u góry widoku:
źródło
Przykład
// W modelu
// W PartailView //PartailView.cshtml
W widoku Index.cshtml
W kontrolerze
musisz przekazać ViewName i Model do metody RenderPartialViewToString. zwróci ci widok z zatwierdzeniem, które zostały zastosowane w modelu i dołączą treść do div „targetId” w Index.cshtml. W ten sposób, przechwytując RenderHtml częściowego widoku, możesz zastosować walidację.
źródło
Formularze Ajax działają asynchronicznie przy użyciu Javascript. Konieczne jest więc załadowanie plików skryptów do wykonania. Mimo że jest to niewielki kompromis w zakresie wydajności, wykonanie odbywa się bez postback.
Musimy zrozumieć różnicę między zachowaniem formularzy HTML i Ajax.
Ajax:
Nie przekieruje formularza, nawet jeśli wykonasz funkcję RedirectAction ().
Wykona asynchronicznie operacje zapisywania, aktualizacji i wszelkich modyfikacji.
HTML:
Przekieruje formularz.
Wykonuje operacje zarówno synchronicznie, jak i asynchronicznie (z dodatkowym kodem i ostrożnością).
Wykazano różnice za pomocą POC w poniższym linku. Połączyć
źródło
Przed dodaniem Ajax.BeginForm. Dodaj poniższe skrypty do swojego projektu w podanej kolejności,
Tylko te dwa są wystarczające do wykonania operacji Ajax.
źródło