取经——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();
时间: 2024-08-26 15:45:57

取经——ASP.NET MVC Ajax的相关文章

ASP.NET MVC ajax提交 防止CSRF攻击

//在View中 <script type="text/javascript"> @functions{ public string ToKenHeaderValue() { string cookieToken,fromToken; AntiForgery.GetTokens(null,out cookieToken,out fromToken); return cookieToken+":"+fromToken; }} $function({ ...

ASP.NET MVC AJAX调用JsonResult方法并返回自定义错误信息

一.如何用AJAX调用JsonResult方法 比如FuckController中添加有个返回JsonResult类型的方法FuckJson(): public JsonResult FuckJson() { return new JsonResult() { Data = new List<string>() { "fuck", "shit" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }

asp.net mvc ajax.beginform()无法上传文件

Asp.Net Mvc使用Ajax.BeginForm上传文件Request.Files始终为null. 使用jquery.form.js插件能解决问题.asp.net mvc ajax.beginform()无法上传文件

Asp.Net MVC Ajax

将ASP.NET MVC中的form提交改为ajax提交 在ASP.NET MVC视图中通过 @using (Html.BeginForm()) 产生的是form表单提交代码,可以用javascript代码截获这个form提交,改为ajax提交,示例代码如下: 代码来自:http://www.cnblogs.com/dudu/archive/2011/12/07/asp_net_mvc_form_ajax.html $('#form1').submit(function () {    if (

ASP.NET MVC ajax处理 AjaxResult

1.统一ASPNET MVC 对ajax请求响应格式定义,方便前端统一处理ajax结果. 1)定义程序返回结果数据格式 1 /// <summary> 2 /// 执行结果 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public class RunResult<T> 6 { 7 /// <summary> 8 /// 操作状态 9 /// &

ASP.NET MVC Ajax.ActionLink 简单用法

ASP.NET MVC 项目中,如何使用类似于 iframe 的效果呢?或者说 Ajax 局部刷新,比如下面操作: 我们想要的效果是,点击 About 链接,页面不刷新(地址栏不变),然后下面的内容进行更新,其实实现这个效果,很简单,只需要使用 Ajax.ActionLink 即可. 1. 安装 Microsoft.jQuery.Unobtrusive.Ajax 程序包 Install-Package Microsoft.jQuery.Unobtrusive.Ajax 2. 引用 JS 文件:

ASP.NET MVC Ajax 伪造请求

1.前言 CSRF(Cross-site request forgery)跨站请求伪造,ASP.NET MVC 应用通过使用AJAX请求来提升用户体验,浏览器开发者工具可以一览众山小,就很容易伪造了请求对应用进行攻击,从而泄露核心数据,导致安全问题.微软自带AntiForgeryToken可以解决,而且语法简单(AJAX请求发起时传递给后台一个字符串,然后在Filter中进行校验) 2.场景如下 为了验证一个来自form post请求,还需要在目标action上增加自定义[AntiForgery

asp .net mvc ajax 传值到后台,并放回JSon值解析

什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 有很多使用 AJAX 的应用程序案例:新浪微博.Google 地图.开心网等等. AJAX定义个用法参考http://www.w3school.com.cn/jquer

Asp.net Mvc Ajax.BeginForm提交表单

之前Mvc中一直用Html.BeginForm提交表单,即如下: @using (Html.BeginForm("Add", "News", FormMethod.Post, new { enctype = "multipart/form-data" })) { <table> <tr> <td><span style="color:red">*</span><