【问题标题】:SQL Error Exception in MVCMVC 中的 SQL 错误异常
【发布时间】:2014-06-15 04:31:57
【问题描述】:

我试图显示由于 SQL 存储过程失败而引发的异常。我在 ajax 中获得响应,但这是使用 requst.responseText 但我不想访问整个 responseText。我只需要此响应文本的标题

我的控制器如下:

public ActionResult ReOrderSegment(string DocumentIDs, long DossierIDForReOrder) 
        {
            try
            {
                var TrimmedString = DocumentIDs.TrimEnd('#');

                var DocumentIDsWithInteger = Convert.ToInt64(DocumentIDs.Split('#').FirstOrDefault());

                long SelectedCompany = db.Documents.FirstOrDefault(x => x.ID == DocumentIDsWithInteger).CompanyID;

                var Message = db.PerformAutomatedSorting(SelectedCompany, DossierIDForReOrder, TrimmedString);

                return Json(Message, JsonRequestBehavior.AllowGet);

            }
            catch (SqlException ex)
            {
                Response.StatusCode = 500;
                Response.TrySkipIisCustomErrors = true;
                return Json(new { errorMessage = ex.Message }, JsonRequestBehavior.AllowGet);
            }

            return Json(0);
        }

和 JS:

 $.ajax({
                    type: 'POST',
                    url: rootUrl("Dossier/ReOrderSegment"),
                    dataType: "json",
                    data: { DocumentIDs: DocumentIDs, DossierIDForReOrder: DossierIDForReOrder },
                    traditional: true,
                    success: function (rest)
                    {
                        alert(rest);

                    },
                    error: function (request, status, error)
                    {
                        //var all = JSON.parse(request.responseText);
                        alert(request.responseText);
                    }   
                });
            });

我在这里附上图片

这里我只想在警报中显示“请仅选择未开票的航空产品”。

【问题讨论】:

    标签: javascript asp.net ajax asp.net-mvc-3


    【解决方案1】:

    您可以在错误块中使用以下代码:

    var newTitle = $(request.responseText).filter('title').text(); // or try find('title').text();
    

    上面的变量 newTitle 应该会显示标题。

    但理想情况下,您应该尝试为 ErrorDetails 创建一个带有字符串 Message 或 List Messages 等属性的小类,以保存所有验证消息并在控制器的 catch 块中像这样返回客户端:

    ErrorDetails errorDetails = new ErrorDetails();
    errorDetails.Message = "Please select only Air Product that are UnInvoiced";
    return Json(errorDetails, JsonRequestBehavior.AllowGet);
    

    在 jquery 代码中,读取错误详情如下:

    error: function(xhr, status, error) {
      var obj = $.parseJSON(xhr.responseText); //can also use xhr.responseJSON directly instead of parsing it.
      alert(obj.Message);
      //use this obj to to read message or list of messages by for loop.
    }
    

    【讨论】:

      【解决方案2】:

      这是我的做法,您可能会觉得有帮助。

      在基本控制器中:

       protected virtual JsonResult JsonError(Exception error, string message = null, int statusCode = 500)
              {
                  JsonNetResult res = new JsonNetResult();
                  res.ContentType = "application/json";
                  res.ContentEncoding = System.Text.Encoding.UTF8;
                  res.Data = new JsonErrorModel(){ error = error, message = message };
      
                  if (error != null)
                      Log.Error(message, error);
                  else if (!string.IsNullOrWhiteSpace(message))
                      Log.Error(message);
      
                  int newStatus = statusCode;
                  if (error != null)
                  {
                      if (error is ArgumentException || error is ArgumentNullException || error is AbsenceSoftException)
                          newStatus = 400;
                      var aggErr = error as AbsenceSoftAggregateException;
                      if (aggErr != null)
                      {
                          newStatus = 400;
                          message = message ?? string.Join("; ", aggErr.Messages);
                      }
                  }
      
                  if (Response != null)
                  {
                      Response.StatusCode = newStatus;
                      Response.StatusDescription = message ?? (error == null ? "An error has ocurred" : error.Message);
                  }
      
                  return res;
              }
      

      在 HomeController:basecontroller 中

       public JsonResult TestCase(Model model)
              {
                  try
                  {
                  }
                  catch (Exception ex)
                  {
                      return JsonError(ex);
                  }
              }
      

      但是,我正在考虑对其进行重构,并将其实现为可重用的异常处理属性,或者可能在 global.asax.cs application_error 方法中管理错误处理代码逻辑。

      【讨论】:

        猜你喜欢
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 2016-08-17
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多