2010-08-04 12 views
6

estoy usando un derivado de rescate MvcContrib:Engañar ASP.NET en Solicitud de pensar es Ajax jQuery Solicitud de Archivo de datos Cargar

public class RescueAttribute : MvcContrib.Filters.RescueAttribute 
{ 
    public RescueAttribute(string view) : base(view) 
    { 
     IgnoreAjax = false; 
    } 

    public RescueAttribute(string view, params Type[] exceptionTypes) : base(view, exceptionTypes) 
    { 
     IgnoreAjax = false; 
    } 

    protected override ActionResult CreateActionResult(Exception exception, ExceptionContext context) 
    { 
     var controller = (string) context.RouteData.Values["controller"]; 
     var action = (string) context.RouteData.Values["action"]; 
     var model = new HandleErrorInfo(exception, controller, action); 

     if (context.Controller.ControllerContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      return new JsonResult(model); 
     } 
     return base.CreateActionResult(exception, context); 
    } 
} 

Ahora cuando se utiliza el archivo de carga en jQuery.form, Request.IsAjaxRequest() devuelve falso. Aparentemente esto se debe a que no puedes cargar un archivo usando json; este complemento genera un iframe oculto para realizar la carga.

Para compensar estoy anexando un campo oculto a cualquier forma que se presente con jquery.form y tiene entradas de archivos:

$(this).append('<input type="hidden" name="X-Requested-With" value="XMLHttpRequest" />'); 

Es lo suficientemente bueno para engañar IsAjaxRequest. ¿Hay alguna razón por la que I no debería hacer esto?

+1

+1 para satifyingly filthy hacking – BritishDeveloper

+0

Así que, básicamente, esto es seguro entonces. –

Respuesta

2

Este método está bien.

JQuery y otras bibliotecas cliente ponen X-Requerido-Con en los encabezados. Sin embargo, los ayudantes ASP Ajax usan elementos ocultos de forma tal como lo hizo anteriormente.

Lo importante es que IsAjaxRequest() comprueba tanto los campos de formulario como los encabezados. Entonces, si encuentra XMLHttpRequest for X-Requested-With en cualquier lugar, devuelve verdadero.

Buena técnica. Podría usarlo un día.

Cuestiones relacionadas