zoukankan      html  css  js  c++  java
  • 研究 asp.net mvc2 ajax 原理

    首先,System.Web.Mvc.Ajax 名称空间下,有一个静态辅助类,叫做 AjaxExtensions.

    他有一系列 ActionLink 方法的重载形式,已供在 html 里使用,方便的生成各种 ajax 链接.
    最终,这些链接都生成类似下面的一个 js 调用:
    (其中 {0} 的位置是传入的叫做 ajaxOptions 的 JSON 格式的参数集合)

    Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), {0});

    那么,接下来把目光转到相应的 js 文件。

    在下列文件中,
    <项目名>\Scripts\MicrosoftMvcAjax.debug.js

    依次追踪函数调用如下:
    AsyncHyperlink.handleClick()
    _asyncRequest();
    Sys.Mvc.MvcHelpers._onComplete()

    在 _onComplete() 函数中,会判断 response 的 header, 决定是执行 js 还是更新元素:

    if ((contentType) && (contentType.indexOf('application/x-javascript') !== -1)) {
        eval(ajaxContext.get_data());
    }
    else {
        Sys.Mvc.MvcHelpers.updateDomElement(ajaxContext.get_updateTarget(), ajaxContext.get_insertionMode(), ajaxContext.get_data());
    }

    在这之后,有一些简单的代码用来隐藏 loading panel,以及调用 onSuccess 或 onFail 的回调函数等,比较
    容易理解,不多说了。

    以上是普通 ajax 超链接的情况,下面简单的看一下 ajax form.
    在 AjaxExtensions 辅助类中,同样有一堆 BeginForm 方法,以供在 html 中使用。
    他们调用了上面 js 文件中的下列函数:

    Sys.Mvc.AsyncForm.handleSubmit()

    而这个函数的作用,是把 form 里的所有字段值序列化为一个字符串,然后仍然是通过上述的 _asyncRequest()
    js 函数来执行,原理类似。
    下面是关键的跟踪代码:

    Sys.Mvc.AsyncForm.handleSubmit = function Sys_Mvc_AsyncForm$handleSubmit(form, evt, ajaxOptions) {
        evt.preventDefault();
        var body = Sys.Mvc.MvcHelpers._serializeForm(form);
        Sys.Mvc.MvcHelpers._asyncRequest(form.action, form.method || 'post', body, form, ajaxOptions);
    }

  • 相关阅读:
    Vue系列:.sync 修饰符的作用及使用范例
    Vue系列:Websocket 使用配置
    Vue系列:Slot 插槽的使用范例
    Vue系列:滚动页面到指定位置实现
    Vue系列:为不同页面设置body背景颜色
    Element UI系列:Upload图片自定义上传
    Vue系列:wangEditor富文本编辑器简单例子
    Element UI系列:Select下拉框实现默认选择
    sublime text 3 15个常用插件介绍
    基于iis下 wcf接口发布
  • 原文地址:https://www.cnblogs.com/RChen/p/1662874.html
Copyright © 2011-2022 走看看