我正在使用源自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已经足够了。我不应该这样做有什么理由吗?
答案 0 :(得分:2)
这种方法很好。
JQuery和其他客户端库将X-Requested-With放入标头中。但是,ASP Ajax助手使用隐藏的表单元素,就像上面一样。
重要的是IsAjaxRequest()检查表单字段和标题。因此,如果它在任一地方找到X-Requested-With的XMLHttpRequest,则返回true。
很棒的技巧。我可能有一天会用它。