#jquery #ajax #asp.net-mvc
#jquery #ajax #asp.net-mvc
Вопрос:
Я знаю, почему я получаю это сообщение, поскольку AJAX завершается и ожидает возврата JSON.
Однако я закодировал метод действия контроллера таким образом, что, если все хорошо, перенаправляет на другое представление. Если обнаружена ошибка, верните JSON — сообщение об ошибке.
С точки зрения AJAX, как я учусь, он будет ожидать возврата JSON независимо от хорошей (перенаправление) или ошибочной ситуации (я возвращаю JSON).
Итак, как мне закодировать это в AJAX, чтобы распознать, что JSON не был возвращен, когда это хорошая ситуация, когда я делаю перенаправление и ничего не возвращаю программно?
Метод action выполняется успешно в том смысле, что он выполняет удаление, выполняет перенаправление, но попадает в return, и я получаю сообщение:
Мой метод действий:
У меня есть
Task<ActionResult>
Если я попытаюсь
Task<JsonResult>
Я получаю сообщение об ошибке в инструкции перенаправления.
public async Task<ActionResult> DeleteUserProfile()
{
string errorMessage = String.Empty;
try
{
Some code to call the web api...
using (var client = new HttpClient())
{
Some code...
// Call the web api - HTTP POST.
HttpResponseMessage result = await client.PostAsync(restOfUrl, argsData);
if (result.IsSuccessStatusCode)
{
return RedirectToAction("Index", "User");
}
else
{
// The web api sent an error response.
errorMessage = "Server error on deleting the user profile. Reason: " result.ReasonPhrase;
}
}
}
catch (Exception ex1)
{
Some code...
}
// Return a JSON object to show the error message.
return Json(errorMessage, JsonRequestBehavior.AllowGet);
}
Мое мнение, что есть AJAX, который вызывает метод:
<input class="btn btn-danger deleteButton" value="Delete Your Profile">
Есть модальное окно, и при ответе «Да» выполняется AJAX. И я думал, что это вернется, только если я нажму JSON с сообщением об ошибке.
$('.btn-yes11').click(function() {
$('#myModal11').modal('hide');
$.ajax({
type: 'POST',
url: '@Url.Action("DeleteUserProfile", "UserProfile")',
dataType: "json",
success: function(jsondata) {
if (jsondata.length > 0)
{
// Set the error message.
$("#jsonErrorMessage").text(jsondata);
// Show.
$("#jsonErrorMessage").css("display", "block");
}
else
{
// Hide.
$("#jsonErrorMessage").css("display", "none");
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert('Critical Error: something is wrong in the call to DeleteUserProfile for delete! Status: ' xhr.status '. Error: ' thrownError.toString() '. Response Text: ' xhr.responseText);
}
});
return true;
});
Комментарии:
1. Привет, у вас
errorMessage = "Server error on deleting the user profile. Reason:...
это не json.2. Это сообщение отправляется обратно, и AJAX обрабатывает его просто отлично. Я отображаю его в представлении OK. Проблема в том, что когда у меня хорошая ситуация, я делаю перенаправление, и оно возвращается без JSON. Кроме того, как мне передать это обратно в JSON?
Ответ №1:
попробуйте этот способ, может быть полезным.
Контроллер
public JsonResult Create(MyObject myObject)
{
//AllFine
return Json(new { IsCreated = True, Content = ViewGenerator(myObject));
//Use input may be wrong but nothing crashed
return Json(new { IsCreated = False, Content = ViewGenerator(myObject));
//Error
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return Json(new { IsCreated = false, ErrorMessage = 'My error message');
}
JS
$.ajax({
type: "POST",
dataType: "json",
url: "MyController/Create",
data: JSON.stringify(myObject),
success: function (result) {
if(result.IsCreated)
{
//... ALL FINE
}
else
{
//... Use input may be wrong but nothing crashed
}
},
error: function (error) {
alert("Error:" erro.responseJSON.ErrorMessage ); //Error
}
});
Комментарии:
1. Хардик… это помогло мне решить мою проблему. Я опубликовал решение выше.
Ответ №2:
Мой код для решения моей проблемы (он больше не выполняет перенаправление и всегда отправляет обратно объект JSON):
public async Task<JsonResult> DeleteUserProfile()
{
string errorMessage = String.Empty;
bool RedirectSwitch = false;
try
{
Some code to call the web api...
using (var client = new HttpClient())
{
Some code...
// Call the web api - HTTP POST.
HttpResponseMessage result = await client.PostAsync(restOfUrl, argsData);
if (result.IsSuccessStatusCode)
{
// Set the switch so that the AJAX call will go to the User controller.
RedirectSwitch = true;
}
else
{
// The web api sent an error response.
errorMessage = "Server error on deleting the user profile. Reason: " result.ReasonPhrase;
}
}
}
catch (Exception ex1)
{
Some code...
}
if (errorMessage != "")
{
// Set an error code which will initiate the AJAX function: 'error: function (error) {}'.
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
}
// Creates JSON representation of anonymous data.
// Return a JSON object.
return Json(new { Redirect = RedirectSwitch, ErrorMessage = errorMessage });
}
Ajax:
$.ajax({
type: 'POST',
url: '@Url.Action("DeleteUserProfile", "UserProfile")',
dataType: "json",
success: function (result) {
if (result.Redirect)
{
// A successful delete - so go to the User controller. To the index action which returns the ViewsUserUser.cshtml.
window.location.href = "/User/Index/";
}
},
error: function (error) {
// Set the error message from the key/value pair set in the controller: ErrorMessage = errorMessage.
$("#jsonErrorMessage").text(error.responseJSON.ErrorMessage);
// Show it.
$("#jsonErrorMessage").css("display", "block");
}
});