将ASP.NET引入Thinking Request是Ajax请求jQuery文件上传

时间:2010-08-04 17:24:28

标签: jquery asp.net-mvc ajax

我正在使用源自MvcContrib的救援:

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

现在,当在jQuery.form中使用文件上传时,Request.IsAjaxRequest()返回false。显然这是因为你无法使用json实际上传文件;这个插件生成一个隐藏的iframe来进行上传。

为了补偿我将隐藏的输入附加到使用jquery.form提交并具有文件输入的任何表单:

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

愚弄IsAjaxRequest已经足够了。我不应该这样做有什么理由吗?

1 个答案:

答案 0 :(得分:2)

这种方法很好。

JQuery和其他客户端库将X-Requested-With放入标头中。但是,ASP Ajax助手使用隐藏的表单元素,就像上面一样。

重要的是IsAjaxRequest()检查表单字段和标题。因此,如果它在任一地方找到X-Requested-With的XMLHttpRequest,则返回true。

很棒的技巧。我可能有一天会用它。