取经——ASP.NET MVC Ajax

一直对ASP.NET MVC 的异步提交搞不懂,今天决定一探究竟。

 

其实核心都封装在jquery.unobtrusive-ajax.js里。

我们发现所有的代码都放在了(function($){}(jQuery))里,这个结构很奇妙,一般的js函数都是function(){},可这个后面多了个参数,其实说白了这是个匿名方法,我们一点点还原它的真实面目。

我们可以写成这样(function($){})(jQuery),

我们再把function方法拿出来

function aa($){

}

aa(jQuery);

这样是不是就看懂了,相当于声明了一个函数aa,然后立即执行它。

而之所以在最外面包上这么一层,是为了把jQuery传进去,以防$和其他库冲突。而在jQuery的世界里,就可以任性的用$了。

 

然后是一大堆的方法,别急,我们一个个看,其实一切都是从它开始的:

$("form[data-ajax=true] :submit").live("click", function (evt) {
        var name = evt.target.name,
            form = $(evt.target).parents("form")[0];

        $(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);

        setTimeout(function () {
            $(form).removeData(data_click);
        }, 0);
 });

看样子是给某个东西执行了live方法。

 

先来看是什么东西。

$(form[data-ajax=true] :submit)

首先找到属性"data-ajax"为true的form表单,然后找到里面的submit按钮,说白了就是我们自己页面点击保存时的提交按钮。

<input type="submit" value="保存"/>

这就对上了,异步提交嘛。

 

再来看live方法,可以查阅Jquery文档,http://www.php100.com/manual/jquery/

哦,原来是给提交按钮绑定click方法,不过通过live绑定更严谨些,详情先一放。总之我们知道这是一点击提交按钮首先执行的函数。

 

然后来看这个函数都干了什么

var name = evt.target.name,
    form = $(evt.target).parents("form")[0];

$(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);

setTimeout(function () {
    $(form).removeData(data_click);
}, 0);

定义了两个变量,name是提交按钮的name属性值,form是提交按钮所在的表单。

但是data方法又是干什么的呢?貌似是存了一个值。

没错,准确的说是存了一个键值对。其实data是把数据存到了form表单这个元素中,至于如何存的,此处暂不多追究。

key叫data_click,value是后面那坨。data_click是个变量,全文搜索一下,在顶部会发现它的声明

 var data_click = "unobtrusiveAjaxClick"

那坨其实是个三目运算符,当name有值时,将下面的对象放到一个数组中,说白了,data_click保存的是提交按钮的name和value属性:

var o = {
   name = name,
   value = evt.target.value
};

当name为空时,存一个空数组。

最后一个方法是过一段时间后,将data_click删掉,但此处有点小疑惑,时间设置为0,不是立即删吗?那还有什么意义?

 

ok,接下来进入下一个函数

$("form[data-ajax=true]").live("submit", function (evt) {
        var clickInfo = $(this).data(data_click) || [];
        evt.preventDefault();
        if (!validate(this)) {
            return;
        }
        asyncRequest(this, {
            url: this.action,
            type: this.method || "GET",
            data: clickInfo.concat($(this).serializeArray())
        });
 });

这个是给data-ajax属性为true的form表单的submit事件绑定函数,是正儿八经的提交函数。

首先,取出了第一个函数中存好的data_click值,就是提交按钮的name和value信息。

submit函数会调用执行绑定到submit事件的首要函数,包括浏览器的默认行为。

而我们想在浏览器有所作为之前进行验证,所以要先阻止默认行为的发生,如下:

evt.preventDefault();

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。