2011-11-08 16 views
5

tengo una acción:ASP.NET MVC conseguir Mensaje de excepción en el Ajax

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
    ... 
    if (model.MyCondition == true) 
     throw new Exception("MyMessage); 
    .... 
} 

me gustaría hacer llegar el mensaje "MiMensaje" en el lado Ajax:

onSuccess: function() { 
... 
}, 
onError: function (jqXHR, textStatus, errorThrown) { 
//I'd like get "MyMessage" here 
} 

una idea de cómo hacer esto ? Cuando consulto con el depurador, no veo mi cadena.

Respuesta

8

Implementar un atributo de error es una buena manera. Además, generalmente no lanzo la excepción, pero devuelvo un status code según el error. Puede escribir a su secuencia de respuesta y el acceso de JS a través de XMLHttpRequest.responseText:

if (model.MyCondition == true) 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     Response.StatusCode = 406; // Or any other proper status code. 
     Response.Write("Custom error message"); 
     return null; 
    } 
} 

y en JS:

... 
error: function (xhr, ajaxOptions, errorThrown) { 
    alert(xhr.responseText); 
} 
0

Intente devolver un ContentResult de su Acción con una acción de tipo GET.

[HttpGet] 
public ContentResult MyAction(String variablename) 
{ 
    ... 
    if (some_verification == true) 
     return Content("MyMessage); 
    .... 
} 

En su página de vista,

$.ajax({ 
    url: 'your controller/action url', 
    type: 'get', 
    cache: false, 
    async: false, 
    data: { variablename: "value" }, 
    success: function (data) { 
     alert(data); 
    }, 
    error: function() { 
     alert('Error doing some work.'); 
    } 
}); 
+0

La pregunta es obtener la cadena de la excepción lanzar en el controlador no forma de cambiar llamar a la acción –

+0

aah derecha. Gracias. – Muthu

0

He resuelto este implementar un ErrorAttribute personalizado:

[NonAction] 
protected void OnException(ExceptionContext filterContext) 
{ 

    this.Session["ErrorException"] = filterContext.Exception; 

    if (filterContext.Exception.GetType() == typeof(MyException)) 
    { 
     // Mark exception as handled 
     filterContext.ExceptionHandled = true; 
     // ... logging, etc 
     if (Request.IsAjaxRequest()) 
     { 
      /* Put your JSON format of the result */ 
      filterContext.Result = Json(filterContext.Exception.Message); 
     } 
     else 
     { 
      // Redirect 
      filterContext.Result = this.RedirectToAction("TechnicalError", "Errors"); 
     } 
    } 
} 

y luego decorar mis acciones con ella.

También puede anular el método OnException de su controlador, pero creo que el atributo personalizado es mucho más flexible.

0

Una posibilidad podría ser la creación de una clase BaseController donde se reemplaza el método del controlador OnException(ExceptionContext filterContext) y convertir las excepciones en JSON para poder procesarlas fácilmente desde un cliente de JavaScript.

Cuestiones relacionadas