ASP.NET MVC «Ajax.BeginForm» выполняет OnSuccess, даже если модель недействительна - PullRequest
17 голосов
/ 07 сентября 2011

У меня есть форма «отправить отзыв», которая использует «Ajax.BeginForm» для визуализации части, содержащей элементы формы.Событие OnSuccess срабатывает, даже если ModelState недопустим.Это нормально?Я ожидал, что смогу сделать несколько обратных передач, что приведет к неверной модели, тогда, когда модель действительна и ошибок нет, событие OnSuccess сработает?

Ответы [ 5 ]

28 голосов
/ 08 мая 2013

Я решаю эту проблему с помощью довольно простой техники javascript:

Сначала настройте ваш OnSuccess следующим образом:

OnSuccess = "UpdateSuccessful(data)"

Затем ваша функция javascript будет такой:

function UpdateSuccessful(data) {
    if (data.indexOf("field-validation-error") > -1) return;

    // Do your valid stuff here
}

Таким образом, нет необходимости связываться с вашим контроллером, или, что более важно, ваш контроллер может возвращать Partial View с ошибками модели, не делая ничего странного, например:

    public ActionResult SaveDetails(Project model)
    {
        if (ModelState.IsValid)
        {
            model.SaveProject();
        }

        return PartialView("ProjectForm", model);
    }

Ив вашем AjaxOptions:

UpdateTargetId = "FormContents"

Теперь просто убедитесь, что у вас есть div или что-то с id="FormContents" везде, где вы хотите, чтобы ваша форма отображалась.

18 голосов
/ 07 сентября 2011

Это нормально?

Да, конечно.Если сервер отправляет HTTP 200, вызывается метод OnSuccess.Понятие валидности состояния модели относится только к стороне сервера.Пока действие вашего контроллера возвращает некоторое представление / частичное / json / ..., OnSuccess сработает.Если в вашем действии контроллера выдается исключение, то вместо OnSuccess будет срабатывать OnError.

Таким образом, для обработки этого случая вы могли бы заставить действие вашего контроллера сделать что-то вроде:*

и затем:

function success(result) {
    if (result.success) {
        // the model was valid
    } else {
        // the model was invalid
    }
}

Теперь в случае недопустимой модели вы можете захотеть показать сообщения об ошибках пользователю, обновив форму.В этом случае вы можете поместить свою форму в частичное, а в случае недопустимого состояния модели вы получите частичное представление из действия контроллера и в случае успеха объект json.Таким образом, в вашем обработчике успеха вы можете проверить:

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
    }
}
4 голосов
/ 19 февраля 2015

Вы можете сделать следующее:

var OnSuccess = function() {
    if ($(".validation-summary-errors").length == 0) { 
        //Your javascript/jquery code goes here
    }
}
1 голос
/ 13 января 2016

Небольшой разброс ответа Луиса:

function OnSuccess() {
    if ($("span[class='field-validation-error']").length == 0) {
        alert("Target Platform saved Successfully.");
    }
}
0 голосов
/ 04 октября 2018

Я возвращаю неверный запрос вместо просмотра, чтобы гарантировать, что вызов ajax вернется по ошибке, а не по ошибке.

В xhr.statustext вы можете найти строку, записанную в неверном запросе, и правильно управлять событием onfail.

Сторона сервера:

if (!ModelState.IsValid)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Model not valid");
        }

Сторона клиента:

$.ajax({
        url: '',
        method: 'POST'            
       }).fail(function (xhr) {
           alert(xhr.statustext);
       });
...