zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ASP.NET中MVC使用AJAX调用JsonResult方法并返回自定义错误信息

NetASP方法AJAXMVC 使用 调用 自定义
2023-06-13 09:15:30 时间

一、如何用AJAX调用JsonResult方法

比如FuckController中添加有个返回JsonResult类型的方法FuckJson():

复制代码代码如下:


<spanclass="kwd">public<spanclass="pln"><spanclass="typ">JsonResult<spanclass="pln"><spanclass="typ">FuckJson<spanclass="pun">()<spanclass="pln">
<spanclass="pun">{<spanclass="pln">
   <spanclass="kwd">return<spanclass="pln"><spanclass="kwd">new<spanclass="pln"><spanclass="typ">JsonResult<spanclass="pun">()<spanclass="pln">
   <spanclass="pun">{<spanclass="pln">
       <spanclass="typ">Data<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="kwd">new<spanclass="pln"><spanclass="typ">List<spanclass="str"><string><spanclass="pun">()<spanclass="pln"><spanclass="pun">{<spanclass="pln"><spanclass="str">"fuck"<spanclass="pun">,<spanclass="pln"><spanclass="str">"shit"<spanclass="pln"><spanclass="pun">},<spanclass="pln"><spanclass="typ">JsonRequestBehavior<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="typ">JsonRequestBehavior<spanclass="pun">.<spanclass="typ">AllowGet<spanclass="pln">
   <spanclass="pun">};<spanclass="pln">
<spanclass="pun">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

如果我们直接在浏览器里调用,是可以看到结果的:

因为在浏览器地址栏直接输入这个地址,是一次GET请求,这就是为毛上面的代码里要写JsonRequestBehavior.AllowGet。

用JQueryAJAX调用的代码如下:

复制代码代码如下:


<spanclass="pln">$<spanclass="pun">.<spanclass="pln">ajax<spanclass="pun">({<spanclass="pln">
   url<spanclass="pun">:<spanclass="pln"><spanclass="str">"/Fuck/FuckJson"<spanclass="pun">,<spanclass="pln">
   data<spanclass="pun">:<spanclass="pln"><spanclass="str">""<spanclass="pun">,<spanclass="pln">
   dataType<spanclass="pun">:<spanclass="pln"><spanclass="str">"json"<spanclass="pun">,<spanclass="pln">
   type<spanclass="pun">:<spanclass="pln"><spanclass="str">"POST"<spanclass="pun">,<spanclass="pln">
   contentType<spanclass="pun">:<spanclass="pln"><spanclass="str">"application/json;charset=utf-8"<spanclass="pun">,<spanclass="pln">
   dataFilter<spanclass="pun">:<spanclass="pln"><spanclass="kwd">function<spanclass="pln"><spanclass="pun">(<spanclass="pln">data<spanclass="pun">)<spanclass="pln"><spanclass="pun">{<spanclass="pln">
       <spanclass="kwd">return<spanclass="pln">data<spanclass="pun">;<spanclass="pln">
   <spanclass="pun">},<spanclass="pln">
   success<spanclass="pun">:<spanclass="pln"><spanclass="kwd">function<spanclass="pln"><spanclass="pun">(<spanclass="pln">data<spanclass="pun">)<spanclass="pln"><spanclass="pun">{<spanclass="pln">
       alert<spanclass="pun">(<spanclass="pln">data<spanclass="pun">);<spanclass="pln">
   <spanclass="pun">}<spanclass="pln">
<spanclass="pun">})</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

url:"/Fuck/FuckJson"很显然是Action的位置。data:""表示FuckJson()放方没有参数。dataType:"json"是理所当然的,我们返回的就是JsonResult。

二、返回自定义错误消息

默认情况下,如果AJAX请求发生了错误。它最多只知道错误码,而无法显示具体的错误信息。但报错通常是需要的,所以我们先要写一个过滤器,作用是一旦发生exception,就给返回的json中的data属性加一个errorMessage。并且,response的状态不能是200,不然ajax请求会以为没有发生错误。一般的服务器端错误代码是500。这个过滤器函数如下:

复制代码代码如下:
<spanclass="kwd">public<spanclass="pln"><spanclass="kwd">class<spanclass="pln"><spanclass="typ">JsonExceptionFilterAttribute<spanclass="pln"><spanclass="pun">:<spanclass="pln"><spanclass="typ">FilterAttribute<spanclass="pun">,<spanclass="pln"><spanclass="typ">IExceptionFilter<spanclass="pln">
<spanclass="pun">{<spanclass="pln">
   <spanclass="kwd">public<spanclass="pln"><spanclass="kwd">void<spanclass="pln"><spanclass="typ">OnException<spanclass="pun">(<spanclass="typ">ExceptionContext<spanclass="pln">filterContext<spanclass="pun">)<spanclass="pln">
   <spanclass="pun">{<spanclass="pln">
       <spanclass="kwd">if<spanclass="pln"><spanclass="pun">(<spanclass="pln">filterContext<spanclass="pun">.<spanclass="typ">RequestContext<spanclass="pun">.<spanclass="typ">HttpContext<spanclass="pun">.<spanclass="typ">Request<spanclass="pun">.<spanclass="typ">IsAjaxRequest<spanclass="pun">())<spanclass="pln">
       <spanclass="pun">{<spanclass="pln">
           filterContext<spanclass="pun">.<spanclass="typ">HttpContext<spanclass="pun">.<spanclass="typ">Response<spanclass="pun">.<spanclass="typ">StatusCode<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="lit">500<spanclass="pun">;<spanclass="pln">
           filterContext<spanclass="pun">.<spanclass="typ">ExceptionHandled<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="kwd">true<spanclass="pun">;<spanclass="pln">
           filterContext<spanclass="pun">.<spanclass="typ">Result<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="kwd">new<spanclass="pln"><spanclass="typ">JsonResult<spanclass="pln">
           <spanclass="pun">{<spanclass="pln">
               <spanclass="typ">Data<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="kwd">new<spanclass="pln">
               <spanclass="pun">{<spanclass="pln">
                   errorMessage<spanclass="pun">=<spanclass="pln">filterContext<spanclass="pun">.<spanclass="typ">Exception<spanclass="pun">.<spanclass="typ">Message<spanclass="pln">
               <spanclass="pun">},<spanclass="pln">
               <spanclass="typ">JsonRequestBehavior<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="typ">JsonRequestBehavior<spanclass="pun">.<spanclass="typ">AllowGet<spanclass="pln">
           <spanclass="pun">};<spanclass="pln">
       <spanclass="pun">}<spanclass="pln">
 
   <spanclass="pun">}<spanclass="pln">
<spanclass="pun">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

之后,我们要给FuckJson()方法加上这个“特征”(Attribute在C#中最好不要翻译为属性),然后故意抛个错做测试。修改后的方法如下:

复制代码代码如下:
<spanclass="pun">[<spanclass="typ">JsonExceptionFilterAttribute<spanclass="pun">]<spanclass="pln">
<spanclass="kwd">public<spanclass="pln"><spanclass="typ">JsonResult<spanclass="pln"><spanclass="typ">FuckJson<spanclass="pun">()<spanclass="pln">
<spanclass="pun">{<spanclass="pln">
   <spanclass="kwd">try<spanclass="pln">
   <spanclass="pun">{<spanclass="pln">
       <spanclass="kwd">throw<spanclass="pln"><spanclass="kwd">new<spanclass="pln"><spanclass="typ">Exception<spanclass="pun">(<spanclass="str">"ohshit!"<spanclass="pun">);<spanclass="pln">
       <spanclass="kwd">return<spanclass="pln"><spanclass="kwd">new<spanclass="pln"><spanclass="typ">JsonResult<spanclass="pun">()<spanclass="pln">
       <spanclass="pun">{<spanclass="pln">
           <spanclass="typ">Data<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="kwd">new<spanclass="pln"><spanclass="typ">List<spanclass="str"><string><spanclass="pun">()<spanclass="pln"><spanclass="pun">{<spanclass="pln"><spanclass="str">"fuck"<spanclass="pun">,<spanclass="pln"><spanclass="str">"shit"<spanclass="pln"><spanclass="pun">},<spanclass="pln"><spanclass="typ">JsonRequestBehavior<spanclass="pln"><spanclass="pun">=<spanclass="pln"><spanclass="typ">JsonRequestBehavior<spanclass="pun">.<spanclass="typ">AllowGet<spanclass="pln">
       <spanclass="pun">};<spanclass="pln">
   <spanclass="pun">}<spanclass="pln">
   <spanclass="kwd">catch<spanclass="pln"><spanclass="pun">(<spanclass="typ">Exception<spanclass="pln">ex<spanclass="pun">)<spanclass="pln">
   <spanclass="pun">{<spanclass="pln">
       <spanclass="kwd">throw<spanclass="pln">ex<spanclass="pun">;<spanclass="pln">
   <spanclass="pun">}<spanclass="pln">
<spanclass="pun">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

捕获异常后,你也可以先记一下log、或是根据你自己的需要处理一下这个异常,然后再throw。

最后我们的AJAX请求代码也得做修改,增加一个error的处理:

复制代码代码如下:
<spanclass="pln">$<spanclass="pun">.<spanclass="pln">ajax<spanclass="pun">({<spanclass="pln">
   url<spanclass="pun">:<spanclass="pln"><spanclass="str">"/Fuck/FuckJson"<spanclass="pun">,<spanclass="pln">
   data<spanclass="pun">:<spanclass="pln"><spanclass="str">""<spanclass="pun">,<spanclass="pln">
   dataType<spanclass="pun">:<spanclass="pln"><spanclass="str">"json"<spanclass="pun">,<spanclass="pln">
   type<spanclass="pun">:<spanclass="pln"><spanclass="str">"POST"<spanclass="pun">,<spanclass="pln">
   contentType<spanclass="pun">:<spanclass="pln"><spanclass="str">"application/json;charset=utf-8"<spanclass="pun">,<spanclass="pln">
   dataFilter<spanclass="pun">:<spanclass="pln"><spanclass="kwd">function<spanclass="pln"><spanclass="pun">(<spanclass="pln">data<spanclass="pun">)<spanclass="pln"><spanclass="pun">{<spanclass="pln">
       <spanclass="kwd">return<spanclass="pln">data<spanclass="pun">;<spanclass="pln">
   <spanclass="pun">},<spanclass="pln">
   success<spanclass="pun">:<spanclass="pln"><spanclass="kwd">function<spanclass="pln"><spanclass="pun">(<spanclass="pln">data<spanclass="pun">)<spanclass="pln"><spanclass="pun">{<spanclass="pln">
       alert<spanclass="pun">(<spanclass="pln">data<spanclass="pun">);<spanclass="pln">
   <spanclass="pun">},<spanclass="pln">
   error<spanclass="pun">:<spanclass="pln"><spanclass="kwd">function<spanclass="pln"><spanclass="pun">(<spanclass="pln">fuckedObject<spanclass="pun">)<spanclass="pln"><spanclass="pun">{<spanclass="pln">
       <spanclass="kwd">try<spanclass="pln"><spanclass="pun">{<spanclass="pln">
           <spanclass="kwd">var<spanclass="pln">json<spanclass="pun">=<spanclass="pln">$<spanclass="pun">.<spanclass="pln">parseJSON<spanclass="pun">(<spanclass="pln">fuckedObject<spanclass="pun">.<spanclass="pln">responseText<spanclass="pun">);<spanclass="pln">
           alert<spanclass="pun">(<spanclass="pln">json<spanclass="pun">.<spanclass="pln">errorMessage<spanclass="pun">);<spanclass="pln">
       <spanclass="pun">}<spanclass="pln"><spanclass="kwd">catch<spanclass="pun">(<spanclass="pln">e<spanclass="pun">)<spanclass="pln"><spanclass="pun">{<spanclass="pln">
           alert<spanclass="pun">(<spanclass="str">"somethingbadhappened"<spanclass="pun">);<spanclass="pln">
       <spanclass="pun">}<spanclass="pln">
   <spanclass="pun">}<spanclass="pln">
<spanclass="pun">})</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

现在请求这个Action,会发现Response的状态已经是500了。并且返回了Json格式的错误信息。