programing

Jquery Ajax, mvc.net 컨트롤러에서 성공/오류 반환

oldcodes 2023. 10. 1. 21:54
반응형

Jquery Ajax, mvc.net 컨트롤러에서 성공/오류 반환

오류 메시지를 회신할 시기와 성공 메시지를 제어하고 싶지만 항상 오류 메시지가 나타납니다.

제가 하려는 일은 다음과 같습니다.

 $.ajax({
                type: "POST",
                data: formData,
                url: "/Forms/GetJobData",
                dataType: 'json',
                contentType: false,
                processData: false,

                success: function (response) {                    
                   alert("success!") 
                },
                error: function (response) {
                   alert("error") // I'm always get this.
                }

            });

컨트롤러:

         [HttpPost]
            public ActionResult GetJobData(Jobs jobData)
            {

              var mimeType = jobData.File.ContentType;
              var isFileSupported = AllowedMimeTypes(mimeType);

             if (!isFileSupported){        
                     //  Error
                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    return Content("The attached file is not supported", MediaTypeNames.Text.Plain);    
             }
            else
              {
                    //  Success
                    Response.StatusCode = (int)HttpStatusCode.OK;
                    return Content("Message sent!", MediaTypeNames.Text.Plain);     

               }   

            }
 $.ajax({
    type: "POST",
    data: formData,
    url: "/Forms/GetJobData",
    dataType: 'json',
    contentType: false,
    processData: false,               
    success: function (response) {
        if (response.success) {
            alert(response.responseText);
        } else {
            // DoSomethingElse()
            alert(response.responseText);
        }                          
    },
    error: function (response) {
        alert("error!");  // 
    }

});

컨트롤러:

[HttpPost]
public ActionResult GetJobData(Jobs jobData)
{
    var mimeType = jobData.File.ContentType;
    var isFileSupported = IsFileSupported(mimeType);

    if (!isFileSupported){        
         //  Send "false"
        return Json(new { success = false, responseText = "The attached file is not supported." }, JsonRequestBehavior.AllowGet);
    }
    else
    {
        //  Send "Success"
        return Json(new { success = true, responseText= "Your message successfuly sent!"}, JsonRequestBehavior.AllowGet);
    }   
}

---보충:-

기본적으로 다음과 같은 방식으로 여러 개의 파라미터를 보낼 수 있습니다.

컨트롤러:

 return Json(new { 
                success = true,
                Name = model.Name,
                Phone = model.Phone,
                Email = model.Email                                
            }, 
            JsonRequestBehavior.AllowGet);

html:

<script> 
     $.ajax({
                type: "POST",
                url: '@Url.Action("GetData")',
                contentType: 'application/json; charset=utf-8',            
                success: function (response) {

                   if(response.success){ 
                      console.log(response.Name);
                      console.log(response.Phone);
                      console.log(response.Email);
                    }


                },
                error: function (response) {
                    alert("error!"); 
                }
            });

사용하다Json대신 수업Content다음과 같이 표시됩니다.

    //  When I want to return an error:
    if (!isFileSupported)
    {
        Response.StatusCode = (int) HttpStatusCode.BadRequest;
        return Json("The attached file is not supported", MediaTypeNames.Text.Plain);
    }
    else
    {
        //  When I want to return sucess:
        Response.StatusCode = (int)HttpStatusCode.OK; 
        return Json("Message sent!", MediaTypeNames.Text.Plain);
    }

내용도 설정유형:

contentType: 'application/json; charset=utf-8',

서버에서 jQuery의 Ajax 호출로 값을 반환할 때 아래 코드를 사용하여 서버 오류를 나타낼 수도 있습니다.

return StatusCode(500, "My error");

아니면

return StatusCode((int)HttpStatusCode.InternalServerError, "My error");

아니면

Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return Json(new { responseText = "my error" });

Http Success 코드 이외의 코드(예: 200[OK])가 앞에서 기능을 트리거합니다.error:고객측(ajax)에서.

다음과 같은 ajax 호출을 받을 수 있습니다.

$.ajax({
        type: "POST",
        url: "/General/ContactRequestPartial",
        data: {
            HashId: id
        },
       success: function (response)  {
            console.log("Custom message : " + response.responseText);
        }, //Is Called when Status Code is 200[OK] or other Http success code
        error: function (jqXHR, textStatus, errorThrown)  {
            console.log("Custom error : " + jqXHR.responseText + " Status: " + textStatus + " Http error:" + errorThrown);
        }, //Is Called when Status Code is 500[InternalServerError] or other Http Error code
        })

또한 다음과 같이 jQuery측과 다른 HTTP 오류를 처리할 수 있습니다.

$.ajax({
        type: "POST",
        url: "/General/ContactRequestPartial",
        data: {
            HashId: id
        },
        statusCode: {
            500: function (jqXHR, textStatus, errorThrown)  {
                console.log("Custom error : " + jqXHR.responseText + " Status: " + textStatus + " Http error:" + errorThrown);
            501: function (jqXHR, textStatus, errorThrown)  {
                console.log("Custom error : " + jqXHR.responseText + " Status: " + textStatus + " Http error:" + errorThrown);
            }
        })

statusCode:서버에서 반환하는 여러 상태 코드에 대해 다른 함수를 호출하려는 경우에 유용합니다.

여기에서 다양한 Http Status 코드 목록을 볼 수 있습니다.위키백과

추가 리소스:

  1. AJAX 호출에서 서버측 오류 반환
  2. JQuery Ajax의 Error 함수 내에서 JsonResult 반환
  3. jQuery를 사용하여 Ajax 오류 처리

컨트롤러에서 잘못된 요청을 반환하면 전역 예외가 트리거됩니다.아마도 클라이언트에 에러페이지가 표시되어 jquery는 200개의 응답을 받습니다.

해결책 1:

컨트롤러

[HttpPost]
public ActionResult FooAction(string id, string[] orderFields)
{
    bool hasError = true; //TODO: Validation

    if (hasError)
    {
       Response.Clear();
       Response.TrySkipIisCustomErrors = true; //the magic
       Response.StatusCode = (int)HttpStatusCode.InternalServerError;

       return Json(new { success = false, message = "test error", status = 500 });
    }
    else
    {
       return Json(new { success = true, message = "ok", status = 200 });
    }
}

보기:

<script type="text/javascript">
    $.ajax({
        type: "POST",
        url: url,
        data: { orderFields: order },
        success: function (response) {
            if (response.success) {
                alert("Ok");
            }
        },
        error: function (xhr, status, error) {
            if (xhr.responseText != "") {
                var err = JSON.parse(xhr.responseText);
                if (err.status == 440) {
                    alert("Session expired");
                }
                else {
                    alert(err.message);
                }
            }
            else {
                alert("Crash");
            }
        }
    });
</script>



해결책 2: (더 우아함)
사용자 지정 특성 만들기

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Net;
using System.Web.Mvc;

public class ExceptionJsonMvcAttribute : FilterAttribute, IExceptionFilter
{
    public virtual void OnException(ExceptionContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (context.Exception == null)
            return;

        int status;
        string message;
        var ex = context.Exception;
        var exceptionType = ex.GetType();
        if (exceptionType == typeof(UnauthorizedAccessException))
        {
            var exAccess = (UnauthorizedAccessException)ex;
            message = exAccess.Message;
            status = (int)HttpStatusCode.Unauthorized;
        }
        else if (exceptionType == typeof(SqlException))
        {
            var exSql = (SqlException)ex;
            message = GetDbMessage(exSql);
            status = (int)HttpStatusCode.BadRequest;
        }
        else if (exceptionType == typeof(KeyNotFoundException))
        {
            var exNotFound = (KeyNotFoundException)ex;
            message = exNotFound.Message;
            status = (int)HttpStatusCode.NotFound;
        }
        else
        {
            message = ex.Message;
            status = (int)HttpStatusCode.InternalServerError;
        }


        string json = ""; // TODO: Json(new { success = false, message = message, status = status });
        context.ExceptionHandled = true;
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.TrySkipIisCustomErrors = true;
        context.HttpContext.Response.StatusCode = status;
        context.HttpContext.Response.ContentType = "application/json";
        context.HttpContext.Response.Write(json);
    }

    private string GetDbMessage(SqlException exSql)
    {
        //TODO: Remove generic from database

        return "DataBase Error see log";
    }
}

ApiController 사용 시스템에 주의를 기울입니다.시스템 대신 Net.Http.Web.Mvc


컨트롤러:

[ExceptionJsonMvc]
[HttpPost]
public ActionResult FooAction(string id, string[] orderFields)
{
    bool hasError = true; //TODO: Validation

    if (hasError)
    {
       throw new Exception("test error");
    }
    else
    {
       return Json(new { success = true, message = "ok" });
    }
}

.Net Core 버전 - 상태 코드를 사용하여 서버 오류를 나타냅니다.

C# 코드

public string methodName(int param1)
   {
   try{
        Response.StatusCode = 200;
        return "";
    }
   catch {
        Response.StatusCode = 400;
        return "";
        }
   }

ajax 호출:

 $.ajax({
 type: 'get',
 url: 'your url',
 data: {"param1":value1},
 success: function (data) {
    alert("success");
    },
  error: function () {
    alert("failed");
    }
 });

언급URL : https://stackoverflow.com/questions/26605065/jquery-ajax-return-success-error-from-mvc-net-controller

반응형