3.5 JQueryAJAX

AJAX是AsynchronousJavaScriptandXML的缩写,其核心是通过XMLHttpRequest对象,以一种异步的方式向服务器发送数据请求,并通过该对象接收请求返回的数据,从而完成人机交互的数据操作。这种利用AJAX技术进行的数据交互并不局限于Web动态页面,在普通的静态HTML页面中同样可以实现,因此,在这样的背景下,AJAX技术在页面开发中得以广泛使用。在jQuery中,同样有大量的函数与方法为AJAX技术提供支持。

AJAX技术通常用于客户端与服务器端异步交换数据,在交换数据时最常被用到的方法是get和post。

1.get

get方法从指定的资源请求数据,$.get方法即采用此种方法实现。采用get方法传递数据时采用“名称/值对”的方法,举例如下:

        /test/demo_form.asp? name1=value1&name2=value2

get方法的其他特性如下:

(1)get请求可被缓存。

(2)get请求保留在浏览器历史记录中。

(3)get请求可被收藏为书签。

(4)get请求不应在处理敏感数据时使用。

(5)get请求有长度限制。

(6)get请求只应用于取回数据。

2.post

post向指定的资源提交要被处理的数据,$.post方法即采用此种方法实现。采用get方法传递数据时采用“名称/值对”的方法进行传递。举例如下:

        POST /test/demo_form.asp HTTP/1.1
        Host: w3schools.com
        name1=value1&name2=value2

post方法的其他特性如下:

(1)post请求不会被缓存。

(2)post请求不会保留在浏览器历史记录中。

(3)post不能被收藏为书签。

(4)post请求对数据长度没有要求。

3.5.1 $.get方法

作用:使用get方法异步获取服务器端的数据。

语法:jQuery.get(url, [data], [callback])

其中,参数url(String):发送请求的URL地址;data(Map):(可选)要发送给服务器的数据,以Key/value的键值对形式表示,会作为QueryString附加到请求URL中。callback(Function):(可选)载入成功时回调函数(只有当Response的返回状态是success才会调用该方法)。

【实例】 使用get方法异步获取学生班级的人数。

实现步骤如下:

(1)新建一个名为StudentController的MVC5控制器。

(2)在StudentController控制器中添加一个名为GetStudentCount的动作,代码如下:

        [HttpGet]
        ///<summary>
        ///根据班级ID获取该班学生的总数
        ///</summary>
        ///<param name="classId">班级ID</param>
        ///<returns>学生总数</returns>
        public string GetStudentCount(string classId)
        {
            if(classId =="32")
            {
                return "45";
            }
            return "0";
        }

小贴士

代码中的[HttpGet]标签是一个属性(可以用其规范类或方法的行为),上例中的[HttpGet]表示该方法只接受客户端使用get方法与Controller进行异步数据交换。

(3)展开Student文件夹,右击并选择“添加(D)”→“MVC视图页(Razor)”,创建一个名为Index的视图,并添加程序代码如下:

        <html>
        <head>
            <meta name="viewport" content="width=device-width" />
            <title></title>
            <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript">
            </script>
            <script type="text/javascript">
                function getStudentCount()
                {
                    $.get("GetStudentCount", {classId:"32"}, function (data,
                    textStatus) {
                        //textStatus有多种状态,仅值为success时才会调用成功
                        if (textStatus =="success")
                        {
                            //将返回结果显示在视图的divContent控件中
                            $("#divContent").html("<span>" +data +"</span>");
                        }
                        else {
                            //给用户提示异常消息
                            alert("异常获取数据失败。消息为:" +textStatus);
                        }
                    })
                }
            </script>
        </head>
        <body>
            <div>
                <input id="btnGetStudentCount" type="button" value="获取学生总数"
                onclick="getStudentCount()" />
              <div id="divContent"></div>
            </div>
        </body>
        </html>

(4)单击“获取学生总数”按钮后,界面如图3-10所示。

图3-10 获取学生的总数

3.5.2 $.post方法

作用:使用post方式来进行异步提交数据的操作。

语法:JQuery.post(url, [data], [callback], [type])

其中,url(String)发送请求的URL地址;data(Map)(可选)为发送给服务器的数据,以Key/value的键值对形式表示;callback(Function)(可选)为载入成功时的回调函数(只有当Response的返回状态是success才会调用该方法); type(String)(可选)用于确定提交的数据格式,如xml、html、script、json、text等。

【例3-6】 使用post方法异步提交学生的信息。

(1)新建一个名为StudentController的MVC5控制器。

(2)在StudentController控制器中添加两个名为Create的动作,第一个Create方法用于显示Create视图,第二个Create方法用于异步创建学生的信息。代码如下:

        //用于显示Create视图
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        ///<summary>
        ///持久化显示页面传递过来的学生信息
        ///</summary>
        ///<param name="name">学生姓名</param>
        ///<param name="gender">学生性别</param>
        ///<param name="birthPlace">出生地</param>
        ///<returns>返回值,true:成功;false:失败</returns>
        public string Create(string name, string gender, string birthPlace)
        {
            if (name =="michael" && gender =="男" && birthPlace =="重庆")
            {
                return "true";
            }
            return "false";
        }

小贴士

代码中的[HttpGet]表示该方法只接受客户端使用post方法与Controller进行异步数据交换。

(3)在Views→Student文件夹下创建一个名为Create的视图,并添加客户端代码如下。

        <html>
        <head>
            <meta name="viewport" content="width=device-width" />
            <title></title>
            <script src="~/Scripts/jquery-1.10.2.min.js"></script>
            <script type="text/javascript">
                //在视图中注册事件,客户端完成加载后触发
                $().ready(function () {
                    //为保存按键注册一个单击事件,用于异步提交数据
                    $("#btnSave").click(function () {
                        var name =$("#name").val();     //从视图中获取用户输入的姓名
                        var gender =$("#gender").val(); //从视图中获取用户输入的性别
                        var birthPlace=$("#birthPlace").val(); //从视图中获取用户输入的出生地

                          $.post("Create", { name: name, gender: gender, birthPlace:
                          birthPlace }, function (data, textStatus) {
                            if(textStatus =="success")
                            {
                                if (data =="true") {
                                    $("#divResult").html("<span>保存成功。</span>");
                                }
                                else {
                                    $("#divResult").html("<span>保存失败。</span>");
                                }
                            }
                            else {
                                $("#divResult").html("<span>"+textStatus+"</span>")
                            }
                        }, "text");
                    })
                });
            </script>
        </head>
        <body>
            <div>
                <span>姓名:</span><input id="name" name="name" />
                <span>性别:</span><input id="gender" name="gender" />
                <span>出生地:</span><input id="birthPlace" name="birthPlace" />
                <input id="btnSave" type="button" value="保存" />
                <div id="divResult"></div>
            </div>
        </body>
        </html>

(4)程序的运行结果如图3-11所示。

图3-11 异步提交学生信息的界面

3.5.3 $.AJAX方法

作用:通过HTTP请求加载远程数据。

语法:jQuery.ajax(options)

options参数列表如表3-8所示。

表3-8 options参数列表

续表

【例】 使用$.ajax实现异步登录。

(1)新建一个名为UserController的MVC4控制器。

(2)在UserController控制器中添加二个名为Login的动作,第一个Login方法用于显示Login视图,第二个Login方法用于异步验证登录信息,代码如下:

        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        ///<summary>
        ///根据用户账号和密码验证登录信息
        ///</summary>
        ///<param name="account">用户账号</param>
        ///<param name="pwd">密码</param>
        ///<returns>返回值,"true":登录成功;"false";用户名或密码错误</returns>
        public string Login(string account, string pwd)
        {
            Thread.Sleep(1000);     //休眠一秒钟,模拟读取数据库的过程
            if (account =="michael" && pwd =="123")
            {
                return "true";
            }
            return "false";
        }

(3)创建一个名为Login的视图,在视图中添加HTML标签并实现与后端代码进行异步交互的JQuery代码,代码如下所示。

        <html>
        <head>
            <meta name="viewport" content="width=device-width" />
            <title>Login</title>
            <script src="~/Scripts/jquery-1.10.2.min.js"></script>
            <script type="text/javascript">
                $().ready(function () {
                    $("#btnLogin").click(function () {
                        var account =$("#account").val();
                        var pwd =$("#pwd").val();
                        $.ajax({
                            type: "post",
                            url: "Login",
                            data:{ account:account, pwd: pwd },
                                                    //向Controller的Login方法传递参数
                            beforeSend: function (XMLHttpRequest) {
                              $("#btnLogin").attr("disabled", "disabled");
                                                            //将“登录”按钮设置为“不可用”
                              $("#btnLogin").val("验证中...");
                                                    //将“登录”按钮的文本设置为“验证中...”
                            },
                            success: function (data, textStatus) {
                              RollBackSaveButton(); //将“登录”按钮的文本回滚到登录前的内容
                              if (data =="true") {
                                  alert("登录成功。");
                              }
                              else {
                                  alert("用户名或密码错误。");
                              }
                            },
                            complete: function (XMLHttpRequest, textStatus) {
                              RollBackSaveButton(); //将“登录”按钮的文本回滚到登录前的内容
                            },
                            error: function () {
                              //请求出错处理
                            }
                        });
                    });
                });

                //将“登录”按钮的文本回滚到登录前的内容
                function RollBackSaveButton()
                {
                    $("#btnLogin").removeAttr("disabled");  //移除“登录”按钮的disabled属性,使其可用
                    $("#btnLogin").val("登录");
                }
            </script>
        </head>
        <body>
            <div>
                <span>用户名:</span><input name="account" id="account" />
                <span>密码:</span><input name="pwd" type="password" id="pwd" />
                <input type="button" id="btnLogin" value="登录" />
            </div>
        </body>
        </html>

(4)输入用户名和密码后,数据异步验证过程的运行界面如图3-12所示。

图3-12 数据异步验证过程的运行界面

(5)后台验证用户名和密码成功后的界面如图3-13所示。

图3-13 后台验证用户名和密码成功后的界面