Я пытаюсь защитить действие контроллера, которое вызывается с помощью функции jQuery ajax.
В моем методе действия код окружен блоком try-catch, поэтому я фиксирую все свои исключения и возвращаю результат JSON с сообщением об исключении. К этому моменту все прекрасно работает.
Проблема начинается, когда я выкидываю исключение вне блока try-catch, например, если исключение возникает в атрибуте действия фильтра. В этом случае я не могу вернуть результат JSON, потому что поток резко останавливается.
jQuery перехватывает это исключение в функции обратного вызова с ошибкой. Но единственное место, где мне удалось увидеть сообщение об исключении - это xhr.responseText, но оно содержит целую ошибку «желтой страницы смерти» от asp.net.
Очень уродливое и хакерское решение, которое я использовал для получения сообщения об исключении, заключается в извлечении текста между тегом . Но я действительно надеюсь, что есть лучший способ сделать это !!
Что бы вы сделали в этом сценарии? Как бы вы защитили свои действия Ajax без написания этой логики внутри метода действия? Как бы вы показали пользователю сообщение от необработанного исключения, выданного действием контроллера ASP.NET MVC, вызванного из jQuery ajax?
jQuery Ajax Call:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: url + "?id=" + id,
success: function(data) {
if(data.success){
alert('Success');
} else {
alert('Fail: ' + data.message);
},
error: function(xhr, status, err) {
// There has to be a better way to do this!!
var title = xhr.responseText.split("<title>")[1].split("</title>")[0];
alert(title);
}
});
Действие контроллера:
[MyAttribute]
public ActionResult MyAction(int id)
{
try
{
// Do something
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
catch (Exception exception)
{
return Json(new { success = false, message = exception.Message }, JsonRequestBehavior.AllowGet);
}
}
Атрибут фильтра действий:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// This causes a 401 Unauthorized HTTP error.
throw new UnauthorizedAccessException("Access Denied.");
}