加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用ASP.NET MVC和JQuery表单插件/文件上传检测IsAjaxRequest()

发布时间:2020-12-15 18:59:59 所属栏目:asp.Net 来源:网络整理
导读:我正在使用 JQuery Form插件在ASP.NET MVC应用程序上执行文件上传.我了解到,由于iframe用于文件上传(而不是XMLHttpRequest,这是不可能的),IsAjaxRequest的服务器端检查失败. 我看过一些与这个问题有关的帖子,但是没有遇到任何解决这个问题的好方法.与我的其
我正在使用 JQuery Form插件在ASP.NET MVC应用程序上执行文件上传.我了解到,由于iframe用于文件上传(而不是XMLHttpRequest,这是不可能的),IsAjaxRequest的服务器端检查失败.

我看过一些与这个问题有关的帖子,但是没有遇到任何解决这个问题的好方法.与我的其他应用程序一样,我希望能够支持JavaScript启用和JavaScript禁用场景,这就是为什么我想检测请求是否为ajax.

我意识到正在使用的iframe方法在技术上不是ajax,但是我试图模仿ajax效果.

欢迎任何建议.

解决方法

我只是意识到我完全没有回答这个问题,所以我在这里添加了顶部,并留下我的旧答案:

问题是当通过iFrame发布文件时,“X-Requested-With”标题未设置,您不能在Javascript中为普通形式的POST设置特定的请求标头.您将不得不诉诸其他技巧,例如发送包含值的POST的隐藏字段,然后更改或覆盖“IsAjaxRequest”扩展方法以检查此情况.
How to override an existing extension method?

可能最好的选择可能是使用不同的名称添加您自己的扩展方法,默认的MVC扩展方法代码与更改以检测您的iFrame上传POST,然后在您希望需要的地方使用您的扩展方法.

默认情况下,jQuery实际上将“X-Requested-With”标头设置为“XMLHttpRequest”.这是非常有用的,只要你小心地做所有的AJAX调用jQuery.

根据您的需要,可以轻松地在动作过滤器中设置检测,以便在需要时使用它,甚至可以将其构建成如下所示的控制器类:

[jQueryPartial]
public abstract class MyController : Controller
{
   public bool IsAjaxRequest { get; set; }
}

ActionFilterAttribute:

public class jQueryPartial : ActionFilterAttribute  
{  
    public override void OnActionExecuting(ActionExecutingContext filterContext)  
    { 
        // Verify if a XMLHttpRequest is fired.  
        // This can be done by checking the X-Requested-With  
        // HTTP header.  
        MyController myController = filterContext.Controller as MyController;
        if (myController != null)
        {
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != null
                && filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                myController.IsAjaxRequest = true;
            }
            else
            {
                myController.IsAjaxRequest = false;
            }
        }
    }
}

并使用实现:

public class SomeController : MyController
{
    public ActionResult Index()
    {
          if (IsAjaxRequest)
               DoThis();
          else
               DoThat();

          return View();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读