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 코드 목록을 볼 수 있습니다.위키백과
추가 리소스:
컨트롤러에서 잘못된 요청을 반환하면 전역 예외가 트리거됩니다.아마도 클라이언트에 에러페이지가 표시되어 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
'programing' 카테고리의 다른 글
JPA Null 또는 0 기본 키가 워크 클론 단위에 있습니다. (0) | 2023.10.01 |
---|---|
MYSQL: 다음 업데이트 트리거가 작동하지 않는 이유는 무엇입니까? (0) | 2023.10.01 |
CSS div 요소 - 가로 스크롤 막대만 표시하는 방법? (0) | 2023.09.26 |
nodejs에서 sql-injection을 방지하고 squelize하는 방법은? (0) | 2023.09.26 |
AngularJS $resource가 $save 메서드에 대해 HTTP POST 대신 HTTP Options를 요청합니다. (0) | 2023.09.26 |