如何在 AJAX 错误方法中检索 DbContext SqlException?

Posted

技术标签:

【中文标题】如何在 AJAX 错误方法中检索 DbContext SqlException?【英文标题】:How to retrieve DbContext SqlException in AJAX error method? 【发布时间】:2017-09-01 14:18:41 【问题描述】:

假设我有一个在向数据库列添加值时不受尊重的检查约束,或者假设我有一个使用 RAISEERROR 和自定义消息的触发器。

在我的 WebMethod 中,我使用 SqlException 在更新数据库时捕获任何错误。因此,如果不遵守检查约束,我应该能够检索自动 SQL Server 错误消息,或者如果触发器引发错误消息正确,我应该能够检索我的自定义消息?

我该怎么做?

以下是我尝试过的:

[WebMethod]
public string AddData(entity e)

   using(var context = new DB_ENTITY_DbContext())
   
       try
       
           context.entity.Add(e);
           context.SaveChanges();
           return "success";
       
       catch(SqlException ex)
       
           return "My custom message " + ex.Message;
       
   

javascript 代码

function AddData()

    $.ajax(

    // Some other settings
    error: function (xhr, status, error)
            alert(JSON.parse(xhr.responseText).Message);
            alert(error);
            
    );

这里错误不返回

“我的自定义消息.....(以及一些自动生成的消息)”....

它返回“内部服务器错误”..

知道我应该怎么做吗?

【问题讨论】:

你调试控制器中的 ex.Message 了吗?那边的异常信息是什么? 使用IHttpActionResult @snorlax 在下面试试我的答案。谢谢 【参考方案1】:

那是因为你捕捉到了异常,并返回了一个简单的字符串。从理论上讲,您的 WebMethod 永远不会失败......(它会失败,但您指示 WebMethod 永远不会通知异常)。这就是为什么您的 ajax 调用永远不会到达错误函数的原因。

通过捕获异常来封装和隐藏错误是一个坏主意。封装并抛出不同的异常,或者只是简单地删除 try/catch 块

【讨论】:

【参考方案2】:

控制器:

public class ClientErrorHandler : FilterAttribute, IExceptionFilter
    
        public void OnException(ExceptionContext filterContext)
        
            var response = filterContext.RequestContext.HttpContext.Response;
            response.Write(filterContext.Exception.Message);
            response.ContentType = MediaTypeNames.Text.Plain;
            filterContext.ExceptionHandled = true;
        
    

    [ClientErrorHandler]
    public class SomeController : Controller
    
        [HttpPost]
        public ActionResult SomeAction()
        
            throw new Exception("Error message");
        
    

查看脚本:

$.ajax(
    type: "post", url: "/SomeController/SomeAction",
    success: function (data, text) 
        //...
    ,
    error: function (request, status, error) 
        alert(request.responseText);
    
);

【讨论】:

抱歉,我对这项技术有点陌生...我将在我的网络表单的代码后面添加所有这些。 ; ClientErrorHandler 将是 webform 后面代码中的一个类; SomeController实际上是我的 webform 的部分类,SomeAction 是我的 WebMethod(我会重载 [WebMethod] 和 [HttpPost])对吗? 'SomeController' 表示您的控制器名称。 我不这么认为...我到处都失败了...它说我必须声明类...我正在尝试将 ti 保存到 jsFiddle 以向您展示 让我们continue this discussion in chat。

以上是关于如何在 AJAX 错误方法中检索 DbContext SqlException?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 4 中检索验证器错误消息

Ajax 检索错误不起作用 Laravel

如何在html中检索Django表单对象以便以后使用AJAX

如何调用ajax从数据库中检索数据

如何使用 ajax 和 php 从 db 中检索数据?

如何在 laravel php 中使用 ajax 根据日期范围从 mysql 数据库中检索数据?