Jquery 未填充故障数据时的Ajax开始表单

Jquery 未填充故障数据时的Ajax开始表单,jquery,ajax,asp.net-mvc,Jquery,Ajax,Asp.net Mvc,我的页面上有以下Ajax助手 @using (Ajax.BeginForm("Activate", null, new AjaxOptions { HttpMethod = "POST", OnSuccess = "AccountActivateSuccess(data)", OnFailure = "AccountActivateFailure(data)" }, new { id = "searchForm" })) 以及下面的JS函数 function AccountActivateSu

我的页面上有以下Ajax助手

@using (Ajax.BeginForm("Activate", null, new AjaxOptions { HttpMethod = "POST", OnSuccess = "AccountActivateSuccess(data)", OnFailure = "AccountActivateFailure(data)" }, new { id = "searchForm" }))
以及下面的JS函数

function AccountActivateSuccess(data) {
        console.log('account activate success');
        console.log(data);    
        //do stuff with information in data
    }

    function AccountActivateFailure(data) {
        console.log('account activate failure');
        console.log(data);
       //do stuff with information in data
    }
控制器的响应如下:

[HttpPost]
public ActionResult Activate(MyModel model)
{
    try
    {
        //something spectacular
         return Json(new {success = true});
    }
    catch (Exception e)
    {
        return Json(new {success = false, message = e});
    }
}
当没有抛出错误时,就会填充“data”变量,我甚至可以在其中放入一个message属性,并在响应中获取该属性的句柄

但是,当抛出异常时,我会得到以下控制台错误:

VM34:3未捕获引用错误:未定义数据

它甚至连控制台的日志都没有

给出了什么?

删除表单定义中回调的“(数据)”参数:

@using (Ajax.BeginForm("Activate", null, new AjaxOptions { HttpMethod = "POST", OnSuccess = "AccountActivateSuccess", OnFailure = "AccountActivateFailure" }, new { id = "searchForm" }))

另外,请确认回调javascript函数的作用域是全局的。

问题实际上是我需要执行
e.ToString()来自我的控制器。同样让人困惑的是,我希望
AccountActivateFailure
函数能够运行,但即使出现异常,它也在Try-Catch内,因此它被放入
accountactivatesucces
函数中,而我并没有在这里设置错误消息


这是一个内部应用程序,因此页面上显示的服务器信息没有问题。用户需要确切地知道出了什么问题,这就是本系统的要点。

异常处理程序中的返回Json行是否会引发异常?也许它无法序列化整个异常。尝试用e.message替换e。通常,在响应中返回异常数据不是一个好的安全策略。这可能会无意中将可用信息泄露给黑客,如文件路径、数据库信息等。相反,让应用程序失败并发生异常,让客户端向用户显示一般错误消息,并让应用程序将所有异常记录到服务器上的Windows事件日志中(在更高级别,例如使用异常筛选器)。但是,要解决即时问题,请写入AccountActivateSuccess(数据)在表单中,配置没有任何意义。您应该提供要运行的函数的名称。该函数的定义将接受数据参数作为输入。您没有任何要传递的数据。AJAX代码调用函数并传递一些数据,这不是您的工作-您只需告诉它要调用哪个函数即可。