Как вернуть объект json по запросу post с сообщением в функцию ajax - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу иметь возможность вернуть объект json с пользовательским сообщением об ошибке / успехе, используя ту же строку кода при запросе после отправки: у меня есть две строки кода:

return Json(data);
return Json(new { f = "error" });

Я хочу, чтобы он отображался в одной строке следующим образом:

return Json(data, Json(new { f = "error" }));

Я знаю, что в моем коде не может быть нескольких операторов возврата. но я хочу вернуть данные с сообщением.

Мой код сервера:

if (getId > 0)
{
    var getList = appointmentRepository.GetAppointmentList(userId);
    var data = Newtonsoft.Json.JsonConvert.SerializeObject(getList);                       
    return Json(data);
    return Json(new { s = "success" });
}
else
{
    var getList = appointmentRepository.GetAppointmentList(userId);
    var data = Newtonsoft.Json.JsonConvert.SerializeObject(getList);
    return Json(data);
    return Json(new { f = "error" });
}

Моя функция Ajax:

<script type = "text/javascript">
   $(document).ready(function () {
      $('#tblAppointment').DataTable({
         dom: 'Bfrtip',
         buttons: [
            'copyHtml5',
            'excelHtml5',
            'csvHtml5',
            'pdfHtml5'
         ]
      });

      var table = $("#tblAppointment").DataTable();
      $("#saveButton").click(function () {

         console.log("appDate:" + $('.datetimepicker').val());
         $.ajax({
            url: '/Appointment/InsertPatientAppointment/',
            type: "POST",
            data: JSON.stringify({
               appointmentDate: $(".datetimepicker").val(),
               patientRegNo: $("#patientRegNo").val(),
               reasons: $("#reasons").val()
            }),

            cache: false,
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (_data) {
               if (_data.f !== undefined) {
                  swal({
                     title: "Failed!",
                     text: _data.f, //"Ooops! something went wrong, 
                     record not saved,
                     try again later ",
                     type: "info"
                  });
                  table.clear().draw();
                  //table.destroy();
                  // $("#viewReportBtn").prop("disabled", false);
                  return false;
               } else {
                  swal({
                     title: "Success!",
                     text: _data.s, //"Appointment added successfully!",
                     type: "success"
                  });

               }
               $(".datetimepicker").val('');
               $("#patientRegNo").val('');
               $("#reasons").val('');

               var arr = $.map(JSON.parse(_data), function (el) {
                  return
                  el
               });

               if (arr.length === 0) {
                  swal({
                     title: "No Record Found!",
                     text: _data.f, //"Your search returns an empty 
                     result set !",
                     type: "info"
                  });
                  table.clear().draw();
                  return false;
               }
               table.clear();
               table.destroy();
               $('#tblAppointment').dataTable({
                  data: arr,
                  columns: [{
                        "data": "MatricRegNo"
                     },
                     {
                        "data": "PatientName"
                     },
                     {
                        "data": "EntryDate"
                     },
                     {
                        "data": "AppointmentDate"
                     },
                     {
                        "data": "Reasons"
                     },
                     {
                        "data": function (data, type, row, meta) {
                           return '<span class="fa fa-edit" data- 
                           toggle = "modal"
                           data - target = "#modal-Edit" > < /span>';
                        }
                     }
                  ],
                  dom: 'Bfrtip',
                  buttons: [
                     'copy', 'csv', 'excel',
                     {
                        extend: 'pdfHtml5',
                        orientation: 'Portriat',
                        pageSize: 'A4'
                     }
                  ]
               });
               table = $("#tblAppointment").DataTable();
            }
         });
      });
   });
</script>

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Вы можете использовать это:

var data = Newtonsoft.Json.JsonConvert.SerializeObject(getList);

var returnData = new object[2];
  returnData[0] = data;
  returnData[1] = new { f = "error" };
  return Json(returnData);
0 голосов
/ 13 ноября 2018

Вы можете интегрировать объект data в свой анонимный объект, который вы уже возвращаете:

return Json(new {data = data, f = "error"});

Если вы сделаете это так, вы можете получить доступ к объекту данных в вашем вызове ajax следующим образом:

success: function (_data) {
    var returnedData = _data.data;
}

Это означает, что вам нужно настроить вызов метода map, когда вы готовите массив данных для таблицы. Вместо:

var arr = $.map(JSON.parse(_data), function (el) { return el });

вызвать его с помощью объекта данных _data.data:

var arr = $.map(JSON.parse(_data.data), function (el) { return el });

Это должно сработать.

0 голосов
/ 12 ноября 2018

Я мог бы подойти следующим образом, расширить JsonResult, чтобы включить код состояния. Таким образом, вы можете диктовать уровень успеха для запроса Ajax.

public class JsonResultWithStatusCode : JsonResult
{
     private readonly HttpStatusCode statusCode;

     public JsonResultWithStatusCode(object data, HttpStatusCode statusCode)
     {
          Data = data;
          this.statusCode = statusCode;
     }

     public override void ExecuteResult(ControllerContext context)
     {
         context.RequestContext.HttpContext.Response.StatusCode = (int)statusCode;
         base.ExecuteResult(context);
     }
}

Тогда внутри вашего контроллера:

if(...) 
{
     var model = JsonConvert.SerializeObject(...);
     return new JsonResultWithStatusCode(model, HttpStatusCode.Ok)
}

else 
{
     var model = new { error = "..." };
     return new JsonResultWithStatusCode(model, HttpStatusCode.InternalServerError);
}

Тогда внутри вашего Ajax вы сможете прочитать код состояния, а затем прочитать тело.

.success: function(response) {
     console.log(response.status); // Status Code (200 or 500 based on above)
     console.log(response.data); // Our model based on above, one writing error the other actual model data.
}

Все, что вам нужно будет сделать, это прочитать на основе выходных данных сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...