programing

ASP.NET MVC "Ajax.BeginForm"은 모델이 유효하지 않더라도 OnSuccess를 실행합니다.

bestprogram 2023. 8. 30. 21:53

ASP.NET MVC "Ajax.BeginForm"은 모델이 유효하지 않더라도 OnSuccess를 실행합니다.

"Ajax"를 사용하는 "피드백 제출" 양식이 있습니다.양식 구성요소를 포함하는 부분을 렌더링하려면 "양식 시작"을 선택합니다.모델 상태가 유효하지 않은 경우에도 OnSuccess 이벤트가 트리거됩니다.이게 정상이야?잘못된 모델을 생성하는 몇 가지 포스트백을 수행할 수 있을 것으로 예상했는데, 모델이 유효하고 오류가 없으면 OnSuccess 이벤트가 트리거됩니까?

저는 이 문제를 꽤 간단한 자바스크립트 기법으로 처리합니다.

첫 번째 설정OnSuccess다음과 같이:

OnSuccess = "UpdateSuccessful(data)"

그러면 당신의 자바스크립트 기능은 다음과 같습니다.

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"양식을 표시할 수 있습니다.

이게 정상이야?

네, 그럼요.서버가 HTTP 200을 보낼 경우 OnSuccess 메서드가 호출됩니다.모델 상태 유효성의 개념은 서버 측에서만 사용됩니다.컨트롤러 작업이 일부 보기/부분/json/을 반환하는 한...OnSuccess가 트리거합니다.컨트롤러 작업 내부에 예외가 발생하면 OnSuccess 대신 OnError가 트리거됩니다.

따라서 이 사례를 처리하기 위해 컨트롤러 작업을 다음과 같이 수행할 수 있습니다.

[HttpPost]
public ActionResult Process(MyViewModel model)
{
    if (!ModelState.IsValid)
    {
        return Json(new { success = false });
    }
    return Json(new { success = true });
}

다음과 같은 경우:

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

잘못된 모델의 경우 양식을 새로 고쳐 사용자에게 오류 메시지를 표시할 수 있습니다.이 경우 양식을 부분 내부에 배치하고 잘못된 모델 상태인 경우 컨트롤러 작업에서 부분 보기를 반환하고 성공적인 경우 개체에 대해 부분 보기를 반환할 수 있습니다.따라서 성공 핸들러에서 다음을 테스트할 수 있습니다.

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
    }
}

다음 작업을 수행할 수 있습니다.

var OnSuccess = function() {
    if ($(".validation-summary-errors").length == 0) { 
        //Your javascript/jquery code goes here
    }
}

루이스의 대답에 약간의 변화가 있었습니다.

function OnSuccess() {
    if ($("span[class='field-validation-error']").length == 0) {
        alert("Target Platform saved Successfully.");
    }
}

Ajax 호출이 성공이 아닌 실패 시 반환되도록 View 대신 잘못된 요청을 반환합니다.

xhr.status 텍스트에서 잘못된 요청에 기록된 문자열을 찾고 실패 시 이벤트를 올바르게 관리할 수 있습니다.

서버 측:

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

클라이언트 측:

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

언급URL : https://stackoverflow.com/questions/7328977/asp-net-mvc-ajax-beginform-executes-onsuccess-even-though-model-is-not-valid