Ошибка: ошибка синтаксиса: неожиданный токен < в JSON

#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");
            }
 });