当ASP.NET异常在服务器上引发错误时,从jqXHR获取错误文本消息

Wat*_* v2 0 asp.net asp.net-mvc jquery asp.net-mvc-4

我有一个服务器端操作,如下所示:

namespace MyProduct.Presentation.Controllers
{
    public class FooController : Controller
    {
        public ActionResult Delete(long[] fooIds)
        {
            throw new Exception("Something went wrong.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从客户端向这个控制器发出一个ajax请求,如下所示:

var url = '/Foo/Delete';

$.ajax(url,
{
  cache: false, async: false, type: 'POST',
  data: JSON.stringify({ fooIds: fooIdsArray }), dataType: 'json',
  contentType: 'application/json', traditional: true,
  error: OnError, success: OnSuccess
});

function OnSuccess(data, textStatus, jqXHR) {
  debugger;
}

function OnError(jqXHR, textStatus, errorThrown) {
  debugger;

  // Here, I want the text "Something went wrong", 
  // which I set as the Message property
  // of my server side exception
}
Run Code Online (Sandbox Code Playgroud)

如何将文本集设置为服务器上引发MessageException对象的属性?

在这种情况下,客户端使用HTTP状态代码500接收HTML响应.因此,我在Fiddler中看到我的响应如下所示:

HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 11 Dec 2013 07:47:26 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 10175
Connection: Close

<!DOCTYPE html>
<html>
    <head>
        <title>Could not delete category. This category has data associated with it. Please delete the associated data first.</title>
        <meta name="viewport" content="width=device-width" />
        <style>
         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} 
         p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
         pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}
         .marker {font-weight: bold; color: black;text-decoration: none;}
         .version {color: gray;}
         .error {margin-bottom: 10px;}
         .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
         @media screen and (max-width: 639px) {
          pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
         }
         @media screen and (max-width: 479px) {
          pre { width: 280px; }
         }
        </style>
    </head>

    <body bgcolor="white">

            <span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>

            <h2> <i>Could not delete category. This category has data associated with it. Please delete the associated data first.</i> </h2></span>

            <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">

            <b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

            <br><br>

            <b> Exception Details: </b>System.Exception: Could not delete category. This category has data associated with it. Please delete the associated data first.<br><br>

            <b>Source Error:</b> <br><br>

            <table width=100% bgcolor="#ffffcc">
               <tr>
                  <td>
                      <code><pre>

Line 66:                 }
Line 67: 
<font color=red>Line 68:                 throw new Exception(errorMessage);
</font>Line 69:             }
Line 70:             catch</pre></code>

                  </td>
               </tr>
            </table>

            <br>

            <b> Source File: </b> C:\Sathyaish\Clients\ESQ\SVN\GlobalizationUI.Presentation\Controllers\CategoryController.cs<b> &nbsp;&nbsp; Line: </b> 68
            <br><br>

            <b>Stack Trace:</b> <br><br>

            <table width=100% bgcolor="#ffffcc">
               <tr>
                  <td>
                      <code><pre>

[Exception: Could not delete category. This category has data associated with it. Please delete the associated data first.]
   MyProduct.Presentation.Controllers.CategoryController.Delete(Int64[] categoryIds) in yada yada yada

</pre></code>

                  </td>
               </tr>
            </table>

            <br>

            <hr width=100% size=1 color=silver>

            <b>Version Information:</b>&nbsp;Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18055

            </font>

    </body>
</html>
<!-- 
[Exception]: Could not delete category. This category has data associated with it. Please delete the associated data first.
   at MyProduct.Presentation.Controllers.CategoryController.Delete(Int64[] categoryIds) in ...yada yada yada...
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以使用以下内容而不是抛出异常:

return new HttpStatusCodeResult(500, "Could not delete category. This category has data associated with it. Please delete the associated data first.");
Run Code Online (Sandbox Code Playgroud)

然后,您可以从textStatus变量访问该消息.