Šiais laikais praktiškai sunku įsivaizduoti Web aplikaciją, kuri nenaudotų Ajax technologijos. Vienas iš tradicinių Ajax panaudojimo pavyzdžių – asinchroninis duomenų pakrovimas (kuris su ASP.NET MVC ir jQuery tapo kaip niekada paprastas). Sakykime, mes turime kontrolerį Home:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult GetList()
{
throw new HttpException((int)HttpStatusCode.NotImplemented, "This method is not yet implemented");
}
}
Ir turime puslapį Index.aspx:
<!DOCTYPE>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET MVC serverinių klaidų apdorojimas iš JavaScript</title>
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.1.js"></script>
</head>
<body>
<div id="list_content"></div>
</body>
<script type="text/javascript">
$.ajax({
url: '/Home/GetList',
cache: false,
success: function (data) {
$('#list_content').html(data);
}
});
</script>
</html>
Kaip matyti iš pateikto kodo, pasikrauna tuščias puslapis, kuris bando į DIV elementą asinchroniškai pakrauti duomenis kviečiant kontrolerio Home metodą GetList (kuris pas mus išmeta klaidą). Kaip teisingai pagauti ir apdoroti serverio klaidas iš JavaScript?
Pirma reikia papildyti mūsų kontrolerį perrašant metodą OnException (šią logiką aš dažniausiai iškeliu į bazinį kontrolerį):
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
var statusCode = filterContext.Exception is HttpException ?
(filterContext.Exception as HttpException).GetHttpCode() :
(int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.StatusCode = statusCode;
filterContext.Result = new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new
{
filterContext.Exception.Message,
filterContext.Exception.StackTrace,
Url = filterContext.HttpContext.Request.RawUrl
}
};
filterContext.ExceptionHandled = true;
}
}
Išnagrinėkime kas yra daroma. Pirma patikrinama ar klaida kilo asinchroninio kreipinio metu. Jeigu taip – patikrinama ar tai HTTP klaida ir jeigu ne, suteikiamas HTTP501 (Internal Server Error) klaidos kodas. Galiausiai yra sudaromas JSON atsakymas, kuriame yra talpinama visa su klaida susijusi informacija (galima papildyti pagal poreikį). Tokiu būdu, vykdant asinchroninį kreipinį, kurio metu serveryje įvyksta klaida, mes gauname klaidos JSON objektą. Beliko šį objektą apdoroti HTML pusėje, tam papildysime jQuery ajax metodą:
<script type="text/javascript">
$.ajax({
url: '/Home/GetList',
cache: false,
success: function (data) {
$('#list_content').html(data);
},
error: function (response) {
var ex = $.parseJSON(response.responseText);
alert("HTTP" + response.status + ": " + ex.Message);
}
});
</script>
Įvykus klaidai serverio pusėje, mes gauname klaidos JSON objektą (objekto response savybė responseText), kuriuo toliau galime operuoti apdorojant klaidą.
Tiek mano patirties iš ASP.NET MVC klaidų apdorojimo iš JavaScript. O kokius dar “triukus” jus taikote JavaScript klaidų apdorojimui?
Rodyk draugams
Naujausi komentarai