2010-08-04 15 views
6

Laden ich eine Rettung von MvcContrib abgeleitet bin mit:ASP.NET in Denken anfordern Tricking anfordern Ajax für jQuery Datei

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); 
    } 
} 

Nun, wenn Sie die Datei-Upload in jQuery.form verwenden, Request.IsAjaxRequest() zurückkehrt falsch. Anscheinend liegt das daran, dass Sie mit json keine Datei hochladen können; Dieses Plugin generiert einen versteckten Iframe um den Upload durchzuführen.

Zum Ausgleich ich einen versteckten Eingang zu irgendeiner Form am Anhängen, die mit jquery.form vorgelegt und Datei Eingänge:

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

Es ist gut genug IsAjaxRequest zu täuschen. Gibt es einen Grund, warum ich sollte nicht dies tun?

+1

+1 für sativingly dreckig hacken – BritishDeveloper

+0

Also im Grunde ist das dann sicher. –

Antwort

2

Diese Methode ist in Ordnung.

JQuery und andere Clientbibliotheken setzen X-Requested-With in die Header. Die ASP Ajax-Helfer verwenden jedoch versteckte Formularelemente wie oben.

Wichtig ist, dass IsAjaxRequest() sowohl Formularfelder als auch Header überprüft. Wenn also an beiden Stellen XMLHttpRequest für X-Requested-With gefunden wird, wird true zurückgegeben.

Schöne Technik. Ich könnte es eines Tages benutzen.