Mam formularz "prześlij opinię", który używa "Ajax.BeginForm" do renderowania części zawierającej elementy formularza. Zdarzenie OnSuccess jest wyzwalane, nawet jeśli parametr ModelState jest niepoprawny. Czy to normalne? Spodziewałem się, że będę w stanie wykonać kilka odesłanych zwrotów, w wyniku których powstanie niepoprawny model, a następnie, gdy model jest prawidłowy i nie wystąpią żadne błędy, wywołałoby to zdarzenie OnSuccess?ASP.NET MVC "Ajax.BeginForm" wykonuje OnSuccess, mimo że model jest nieprawidłowy
Odpowiedz
Czy to normalne?
Tak, oczywiście. Jeśli serwer wyśle HTTP 200, wywoływana jest metoda OnSuccess. Pojęcie ważności modelu jest tylko po stronie serwera. Dopóki działanie kontrolera zwróci część widoku/części/json/..., uruchomi się OnSuccess. Jeśli wyjątek zostanie zgłoszony wewnątrz działania kontrolera, zostanie uruchomiony OnError zamiast OnSuccess.
Więc aby obsłużyć ten przypadek można mieć swoje działania kontrolera zrobić coś wzdłuż linii:
[HttpPost]
public ActionResult Process(MyViewModel model)
{
if (!ModelState.IsValid)
{
return Json(new { success = false });
}
return Json(new { success = true });
}
a następnie:
function success(result) {
if (result.success) {
// the model was valid
} else {
// the model was invalid
}
}
obecnie w przypadku nieprawidłowej modelu może chcesz wyświetlać komunikaty o błędach użytkownikowi, odświeżając formularz. W takim przypadku możesz umieścić formularz w częściowej części, aw przypadku nieprawidłowej pozycji modelu możesz zwrócić widok częściowy z działania kontrolera, aw przypadku sukcesu obiekt json. Więc w przewodnika sukces można testować:
function success(result) {
if (result.success) {
// the model was valid
} else {
// there were errors => show them
$('#myform_container').html(result);
// if you are using client side validation you might also need
// to take a look at the following article
// http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx
// and reattach the client validators to the form as you are
// refreshing its DOM contents here
}
}
Dziękuję, dziękuję. Ta odpowiedź jest idealna. Jestem zaskoczony, że nie ma solidnej dokumentacji dotyczącej obsługi tego scenariusza (błędy modelu) z dyskretnym materiałem AJAX. –
Nie działa dla mnie, ponieważ w przypadku niepowodzenia, muszę zwrócić widok, a nie JSON. – Misi
Myślę, że najpierw musisz sprawdzić typ wyniku: if (typeof (result) == "object" && result.success) { – Misi
obsłużyć ten problem z dość prostej techniki javascript:
Pierwszy konfiguracji Twój OnSuccess
tak:
OnSuccess = "UpdateSuccessful(data)"
Następnie JavaScript działają jak to:
function UpdateSuccessful(data) {
if (data.indexOf("field-validation-error") > -1) return;
// Do your valid stuff here
}
W ten sposób nie ma potrzeby bałagan w ith kontrolera, lub co ważniejsze, kontroler może zwrócić Partial View
z modelem błędów nie robiąc nic dziwne, tj:
public ActionResult SaveDetails(Project model)
{
if (ModelState.IsValid)
{
model.SaveProject();
}
return PartialView("ProjectForm", model);
}
iw swoim AjaxOptions
:
UpdateTargetId = "FormContents"
Teraz wystarczy upewnić się, że a div
lub coś z id="FormContents"
w dowolnym miejscu, w którym chcesz wyświetlić formularz.
'OnSuccess =" UpdateSuccessful (data) "': really helpful. dzięki. –
Czy ten ** obiekt "data" działa we wszystkich przeglądarkach? czy ma jakieś ograniczenia lub problemy ze zgodnością? –
Powinno to działać we wszystkich przeglądarkach z włączoną obsługą języka JavaScript. –
można wykonać następujące czynności:
var OnSuccess = function() {
if ($(".validation-summary-errors").length == 0) {
//Your javascript/jquery code goes here
}
}
niewielkie zmiany na odpowiedź Luisa:
function OnSuccess() {
if ($("span[class='field-validation-error']").length == 0) {
alert("Target Platform saved Successfully.");
}
}
Zgadzam się, że to jest niepotrzebnie skomplikowane, aby pracować. Oczywiście potrzebujemy prostej wartości, która wskazuje, czy dany model jest ważny. –