ASP.NET obsługa błędów MVC Ajax
Jak obsĹ 'ugiwaÄ ‡ wyjÄ ... tki wrzucone do kontrolera, gdy jQuery ajax wywoĹ' a akcjÄ™?
Na przykład, chciałbym, aby globalny kod javascript, który jest wykonywany na każdym rodzaju serwera wyjątku podczas wywołania ajax, który wyświetla komunikat wyjątku, jeśli w trybie debugowania lub po prostu zwykły komunikat o błędzie.
Po stronie klienta wywołam funkcję o błędzie ajax.
Po stronie serwera, czy muszę napisać własny filtr actionfilter?
6 answers
Jeśli serwer wyśle kod stanu inny niż 200, wywołanie zwrotne błędu jest wykonywane:
$.ajax({
url: '/foo',
success: function(result) {
alert('yeap');
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert('oops, something bad happened');
}
});
I aby zarejestrować globalną obsługę błędów, możesz użyć $.ajaxSetup()
"metoda": {]}
$.ajaxSetup({
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert('oops, something bad happened');
}
});
Innym sposobem jest użycie JSON. Możesz więc napisać własny filtr akcji na serwerze, który wychwytuje wyjątki i przekształca je w odpowiedź JSON:
public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
{
Data = new { success = false, error = filterContext.Exception.ToString() },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
A następnie udekoruj akcję kontrolera tym atrybutem:
[MyErrorHandler]
public ActionResult Foo(string id)
{
if (string.IsNullOrEmpty(id))
{
throw new Exception("oh no");
}
return Json(new { success = true });
}
I na koniec przywołać:
$.getJSON('/home/foo', { id: null }, function (result) {
if (!result.success) {
alert(result.error);
} else {
// handle the success
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 20:21:44
Po googlowaniu piszę prosty wyjątek oparty na filtrze MVC Action:
public class HandleExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new
{
filterContext.Exception.Message,
filterContext.Exception.StackTrace
}
};
filterContext.ExceptionHandled = true;
}
else
{
base.OnException(filterContext);
}
}
}
I pisać w global.ascx:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleExceptionAttribute());
}
A następnie napisz ten skrypt na stronie layout lub Master:
<script type="text/javascript">
$(document).ajaxError(function (e, jqxhr, settings, exception) {
e.stopPropagation();
if (jqxhr != null)
alert(jqxhr.responseText);
});
</script>
Na koniec należy włączyć błąd Niestandardowy. a potem ciesz się:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 18:33:39
Niestety, żadna z odpowiedzi nie jest dla mnie dobra. Zaskakująco rozwiązanie jest znacznie prostsze. Return from controller:
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Response.ReasonPhrase);
I obsłuż go jako standardowy błąd HTTP na kliencie, jak chcesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 14:11:47
W zgodzie z odpowiedzią aleho Oto kompletny przykład. To działa jak urok i jest bardzo proste.
Kod kontrolera
[HttpGet]
public async Task<ActionResult> ChildItems()
{
var client = TranslationDataHttpClient.GetClient();
HttpResponseMessage response = await client.GetAsync("childItems);
if (response.IsSuccessStatusCode)
{
string content = response.Content.ReadAsStringAsync().Result;
List<WorkflowItem> parameters = JsonConvert.DeserializeObject<List<WorkflowItem>>(content);
return Json(content, JsonRequestBehavior.AllowGet);
}
else
{
return new HttpStatusCodeResult(response.StatusCode, response.ReasonPhrase);
}
}
}
Kod Javascript w widoku
var url = '@Html.Raw(@Url.Action("ChildItems", "WorkflowItemModal")';
$.ajax({
type: "GET",
dataType: "json",
url: url,
contentType: "application/json; charset=utf-8",
success: function (data) {
// Do something with the returned data
},
error: function (xhr, status, error) {
// Handle the error.
}
});
Mam nadzieję, że to pomoże komuś innemu!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 18:38:35
Zrobiłem szybkie rozwiązanie, ponieważ brakowało mi czasu i działało ok. Chociaż myślę, że lepszą opcją jest użycie filtra wyjątków, może moje rozwiązanie może pomóc w przypadku, gdy potrzebne jest proste rozwiązanie.
Zrobiłem co następuje. W metodzie kontrolera zwróciłem jsonresult z właściwością "Success"wewnątrz danych: [HttpPut]
public JsonResult UpdateEmployeeConfig(EmployeConfig employeToSave)
{
if (!ModelState.IsValid)
{
return new JsonResult
{
Data = new { ErrorMessage = "Model is not valid", Success = false },
ContentEncoding = System.Text.Encoding.UTF8,
JsonRequestBehavior = JsonRequestBehavior.DenyGet
};
}
try
{
MyDbContext db = new MyDbContext();
db.Entry(employeToSave).State = EntityState.Modified;
db.SaveChanges();
DTO.EmployeConfig user = (DTO.EmployeConfig)Session["EmployeLoggin"];
if (employeToSave.Id == user.Id)
{
user.Company = employeToSave.Company;
user.Language = employeToSave.Language;
user.Money = employeToSave.Money;
user.CostCenter = employeToSave.CostCenter;
Session["EmployeLoggin"] = user;
}
}
catch (Exception ex)
{
return new JsonResult
{
Data = new { ErrorMessage = ex.Message, Success = false },
ContentEncoding = System.Text.Encoding.UTF8,
JsonRequestBehavior = JsonRequestBehavior.DenyGet
};
}
return new JsonResult() { Data = new { Success = true }, };
}
Później w wywołaniu ajax po prostu poprosiłem o tę właściwość, aby wiedzieć, czy mam wyjątek:
$.ajax({
url: 'UpdateEmployeeConfig',
type: 'PUT',
data: JSON.stringify(EmployeConfig),
contentType: "application/json;charset=utf-8",
success: function (data) {
if (data.Success) {
//This is for the example. Please do something prettier for the user, :)
alert('All was really ok');
}
else {
alert('Oups.. we had errors: ' + data.ErrorMessage);
}
},
error: function (request, status, error) {
alert('oh, errors here. The call to the server is not working.')
}
});
Mam nadzieję, że to pomoże. Happy code! : PWarning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 02:48:20
Do obsługi błędów wywołań ajax po stronie klienta, przypisujesz funkcję do opcji error
wywołania ajax.
Aby ustawić wartość domyślną globalnie, możesz użyć funkcji opisanej tutaj: http://api.jquery.com/jQuery.ajaxSetup .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 20:14:53