2010-08-04 66 views
6

我使用從MvcContrib衍生救援:使用jQuery.form,Request.IsAjaxRequest文件上傳時誘騙ASP.NET以爲請求AJAX請求的jQuery文件上傳

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

Now()傳假。顯然這是因爲你實際上無法使用json上傳文件;這個插件會生成一個隱藏的iframe來進行上傳。

爲了彌補我追加一個隱藏的輸入到與jquery.form提交併有文件輸入任何形式:

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

這是不夠好糊弄IsAjaxRequest。是否有任何理由,我不應該做到這一點?

+1

+1爲了滿足骯髒的黑客行爲 – BritishDeveloper 2010-08-04 21:19:51

+0

所以基本上這是安全的。 – 2010-08-06 17:25:40

回答

2

這種方法很好。

JQuery和其他客戶端庫在頭文件中放入了X-Requested-With。但是,ASP Ajax幫助程序使用隱藏的表單元素,就像上面所做的那樣。

重要的是IsAjaxRequest()檢查表單域和標題。因此,如果它在任一位置發現X-Requested-With的XMLHttpRequest,它將返回true。

不錯的技術。我可能會在一天內使用它。