我想要做的是将自定义错误从 asp.net mvc4 控制器传递给 jquery.ajax() 调用。所以我写了一个自定义错误过滤器:
public class FormatExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult()
{
ContentType = "application/json",
Data = new
{
name = filterContext.Exception.GetType().Name,
message = filterContext.Exception.Message,
callstack = filterContext.Exception.StackTrace
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
else
{
base.OnException(filterContext);
}
}
}
我通过执行以下操作将其注册为全局过滤器:
GlobalFilters.Filters.Add(new FormatExceptionAttribute());
在我的 mvc4 视图中定义的 ajax 调用下方(请注意,任务是一个类似于“/MyController/MyAction/”的字符串):
function loadData(task) {
ajax({
url: task,
type: 'POST',
dataType: 'json',
contentType: "application/json; charset=utf-8"
}).then(function (data) {
$(data).map(function (i, item) {
addNewElement(item);
})
},
function (xhr) {
try {
// a try/catch is recommended as the error handler
// could occur in many events and there might not be
// a JSON response from the server
var json = $.parseJSON(xhr.responseText);
alert(json.errorMessage);
} catch (e) {
alert('something bad happened');
}
});
};
所以 Mycontroller 中的 MyAction 如下所示:
[HttpPost]
public ActionResult MyAction()
{
try
{
var dataCollection = (dynamic)null;
using (ConfigContext context = new ConfigContext())
{
dataCollection = context.MyItems.Where(i=> i.TypeId == 1).AsEnumerable().OrderBy(k => k.Name).Select(w => new
{
Alias = string.Format("{0}-{1}", Resources.Constants.Prefix, w.Id),
Name = w.Name,
Desc = w.Desc
}).ToArray();
}
return Json(dataCollection);
}
catch (Exception ex)
{
// I want to return ex.Message to the jquery.ajax() call
JsonResult jsonOutput = Json(
new
{
reply = new
{
status = "Failed in MyAction.",
message = "Error: " + ex.Message
}
});
return jsonOutput;
}
}
出于某种原因,在 jquery.ajax() 调用中,当尝试使用以下方法转换为 json 时,我没有收到控制器(服务器端)和 jquery.ajax() 发送的 ex.message 错误:
var json = $.parseJSON(xhr.responseText);
抛出一个异常,说它不是 json 结果,所以在 jquery.ajax 中进入了 catch 正文:
} catch (e) {
alert('something bad happened');
}
所以我想做的是:
- 将 ex.message 从控制器返回到 jquery.ajax() 调用。
- 另外(很高兴拥有),而不是将上面指示的自定义错误过滤器注册为 global.asax.cs 中的全局过滤器,我只想将其应用于那些由 ajax 调用调用的特定控制器/操作。
- 此外(也许打开另一个线程会更好),当我将我的 Web 应用程序部署/发布为 IIS 上的默认网站下的应用程序时,控制器中 MyAction 中的字符串连接(String.format)会引发异常,但是它是将其部署为单独的网站时工作正常(不会引发任何错误)。我正在使用嵌入式 SQL Server 精简版 SQLCe。据我所知,它不支持串联,但我通过应用 AsEnumerable() 解决了这个问题。它在将 Web 应用程序部署为单独的网站时有效,但在将其部署为默认网站下的应用程序时无效。这里有什么想法吗?