自从有了JQuery,Ajax的运用变的越来越方便了,然则运用中照样会或多或少的涌现一些让人短时间内痛楚的题目。本文临时总结一些在运用JQuery Ajax中应当注重的题目,若有不适当或许不完善的处所,迎接人人指正和补充。
本文将从Ajax要求aspx、ashx和asmx三种体式格局议论。
起首看看要求aspx的状况
Aspx页面的Ajax要求能够有两种体式格局:
1、 经由过程运用get或许post要领,通报页面地点为url参数的值,并附带一些标记参数,直接要求。这类体式格局的Ajax被一些人誉为“假的Ajax”,表面上没有革新页面,实在背景的实行状况和革新 页面的结果是一样的。
实在这类状况也能够要求页面中的特定的要领,只需运用附带的参数去推断,就能够“要求”特定的要领了。
下面展现了运用两种差别的要领要求两个差别页面的状况,只是摘抄了代码,细致的细致代码能够在文章末端下载。
前台:
// 直接要求页面的体式格局 $(function () { /* $.get( "RequestPage.aspx", { "token": "ajax" }, function (data) { $("#dataShow").text(data); } );*/ $.ajax({ type:"Post", url: "ResponsePage.aspx", // data: "{'token':'ajax'}",// 运用这类体式格局居然没法通报参数,列位有晓得缘由的通知一下啊。 data:"token=ajax", success: function (data) { $("#dataShow").text(data); } }); })
背景:
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { if ((Request["token"]??"")=="ajax") { // 下面这些内从能够放在一个要领里,然后经由过程“token”标记去推断实行哪一个要领。 Response.Write("我是直接要求aspx页面返回的笔墨!"); Response.End(); } } }
以上要求返回值都是字符串也就是dataType为text或许html范例。
假如如果愿望要求返回的数据是xml或许json花样的,该怎么办呢?
假如如果xml花样的,须要增加一句Response.ContentType=”application/xml”;另有一点要注重的是Write中的内容必需是能够剖析为xml的字符串才够,比方“<my>123</my>”是能够的,“123”是不能够的,因为返回的信息中responseXml即是null。如下图:
前台:
$.ajax({ type: "Post", url: "ResponsePage.aspx", // data: "{'token':'ajax'}",// 运用这类体式格局居然没法通报参数,列位有晓得缘由的通知一下啊。 data: "token=ajax", // 不须要指定contentType,因为指定后返回的是全部页面的html,不晓得为啥,要求解答啊。 dataType: "xml", success: function (data) { alert(data); }, error: function (d, c,e) { alert(e); } });
背景:
// 假如如果返回的相应为xml,则必需如许设置 Response.ContentType = "application/xml"; // 假如如果返回的相应为xml,返回的字符串必需是能够被剖析的xml文档花样。 Response.Write("<my>123</my>"); Response.End();
假如是为json花样的,背景代码中Response.ContentType=”application/json”这句无足轻重,不影响返回的值。然则Response.Write中的值肯定如果json花样的,不然会有Invalid Json花样的毛病。
前台:
$.ajax({ type: "Post", url: "ResponsePage.aspx", // data: "{'token':'ajax'}",// data必需是一个{key:value}的情势,这是一个字符串,是不可的。 // data:{token:"ajax"},// 这类体式格局也可行。 data: "token=ajax", // 不须要指定contentType,因为jquery会自动增加contentType=“application/x-www-form-urlencode”。 dataType: "json", success: function (data) { alert(data); }, error: function (d, c,e) { alert(e); } });
纪录:假如直接要求一个页面,假如data运用"{'token':'ajax'}"这类字符串的情势,jquery是没法转换为token=ajax的情势的。
jquery 文档中说,能够运用{key:value}情势的data要求页面,此时jquery会自动增加contentType=“application/x-www-form-urlencode”,使传入的data自动转换为key=value的情势。
背景:
// 假如如果返回的相应为xml,则必需如许设置 Response.ContentType = "application/json"; // 假如如果返回的相应为xml,返回的字符串必需是能够被剖析的xml文档花样。 Response.Write(“[123]"); Response.End();
2、 要求aspx页面背景中的要领。
实在上面的直接要求页面的要领中也跟引见了一种要求页面内要领的解决方案,那就是在前台的ajax中通报一个参数作为标记,比方上面的谁人“token”,然后在背景的page_load内里推断token的值,依据值的差别实行差别的要领。下面要引见的是直接实行页面背景中的要领。
(1)运用轻便get或许post要领时,因为不能设置contentType和dataType所以纵然要求的是页面中的要领,末了要求的照样当前页面,返回的值仍旧是当前页面的html内容。所以在要求 要领的时刻,轻便要领照样不合适的。
(2) 运用非轻便要领时,不管是post照样get,假如dataType为xml、text、htm,末了返回的值仍旧是全部html页面的内容。所以假如要想到的值,照样设置dataType为“json”吧,不 要遗忘还要设置contentType为“application/json;charset=utf-8”,不设置这个,json也是返不返来的。而且还必需保证背景的被要求的要领是static的,另有[webmethod]标记,而且还必需是public的。
前台:
$.ajax({ type: "post", url: "RequestPage.aspx/RequestedMethod", contentType: "application/json;charset=utf-8", dataType: "json", success: function (res) { alert("success:"+res.d); // 注重这点背面要加个d才猎取字符串信息,至于为何要加个d,你经由过程chrome看看返回的相应就晓得了,O(∩_∩)O }, error: function (xmlReq, err, c) { alert("error:" + err); } });
背景:
// 须要被Ajax要求的背景要领 [WebMethod] [ScriptMethod(UseHttpGet=true)] // 假如要运用POST要求,去掉这个标记 public static string RequestedMethod() { return "[123]"; }
直接运用post是没有题目的:
假如type改成“get”,则会涌现“500内部毛病”。毛病信息为:{"Message":"尝试运用 GET 要求挪用要领“RequestedMethod”,但不许可如许做。
解决要领就是在后要领上再加一个标[ScriptMethod(UseHttpGet=true)],ScriptMethod 在System.Web.Script.Services下.如许以后,就能够在前台经由过程Get体式格局要求了,然则假如加了这个标记以后,前台就不能用POST举行要求了。
3、 要求aspx页面背景中的要领,带参数
前台:
$.ajax({ type: "Post", url: "ResponsePage.aspx/RequestMethod1", data:"{'msg':'hello'}", contentType: "application/json;charset=utf-8",// 这句可不要忘了。 dataType: "json", success: function (res) { $("#dataShow").text("success:" + res.d); // 注重有个d,至于为何经由过程chrome看相应吧,O(∩_∩)O。 }, error: function (xmlReq, err, c) { $("#dataShow").text("error:" + err); } });
背景:
[WebMethod] public static string RequestMethod1(string msg) { return msg; }
总体上带参数的体式格局和不带参数相似,差别点就是在运用ajax要求的时刻,要通报一个data参数,注重这个data肯定是一个json花样的字符串,不然就会报json毛病的,细致为何,因为你通报的contentType是application/json啊。
要求asmx(webservice)的状况
要求webservice的时刻,重如果要求webservice中的要领,在要求之前不要遗忘了代码开首的那段作废解释的提醒“// 若要许可运用 ASP.NET AJAX 从剧本中挪用此 Web 效劳,请作废对下行的解释。
// [System.Web.Script.Services.ScriptService]”
要求webservice中的要领的处理体式格局和要求aspx页面背景要领的处理体式格局相似,但也有一些差别。
被要求的webservice中要领的特性:
(1) 要求的要领必需是为public的。
(2) 要领必需有[WebMethod]标记。
(3) 假如想运用Get的体式格局要求,还要有[ScriptMethod(UseHttpGet=true)]标记。运用Get要求Webservice的要领的时刻,只增加这个标记是不够的,还要修正Web.Config文件,让WebService支撑Get体式格局要求,不然会涌现 “因 URL 意外埠以“/GetXmlByGet”完毕,要求花样没法辨认。“的毛病。修正要领为:在System.web设置节下增加以下赤色的内容:
<System.web> …………… <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices> </System.web>
(4) 要求xml数据范例的时刻,要注重,假如要领返回的是string范例的,返回的xml花样是如许的:
假如要领返回的是字符串,则会把返回的字符串包装在<string>标签中返回。
比方以下要领要求后的返回值:
[WebMethod] public string GetXmlByPost() { return "我是经由过程Post体式格局要求返回的xml "; }
返回值:
<?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">我是经由过程Post体式格局要求返回的xml</string>
赤色部份是被要求要领返回的字符串,其他是自动增加的,所以在前台中经由过程jquery猎取数据的时刻,应当$(res).find(”string”).text();假如要领返回的是xmlDocument对象,则就是要领中组织的xml对象。
比方以下要领要求后的返回值:
// 运用Get体式格局要求xml,注重返回的字符串肯定如果能够剖析的xml花样。 [WebMethod] [ScriptMethod(UseHttpGet = true)] public System.Xml. XmlDocument GetXmlByGet() { string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><my>我是经由过程Get体式格局要求返回的xml</my>"; System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.LoadXml(xml); return doc; }
返回的相应为:
<?xml version=\"1.0\" encoding=\"utf-8\"?><my>我是经由过程Get体式格局要求返回的xml</my>
此时就能够经由过程$(res).find(”my”).text()的体式格局取数据了。此时操纵的完全是你本身组织的xml。
(5) 关于要求返回JSON须要注重的就是,返回的也是“[d:{}]”花样的数据,地点前台猎取的时刻,肯定要加个”.d”,其他的和xml差不多了。
(6) Text的范例的就不多说了。
要求ashx的状况
要求ashx的时刻和直接要求apsx页的状况相似,毕竟都是经由过程response.Write(string)的体式格局返回数据的。
须要注重的处所是:context.Response.ContentType的值,依据dataType的值辨别:
Text:“text/plain“;
XML:“application/xml“;
JSON:“application/json“.
dataType为xml的时刻,response.Write(string)中的字符串肯定要相符xml的花样,为json的时刻,response.Write(string)中的字符串肯定要相符json的花样为不然会涌现剖析毛病,这个和aspx页是一样的。
假如要运用session的话,在handler的代码中增加System.Web.SessionState的援用,并让这个handler继续IRequiresSessionState接口,肯定要继续这个接口,不然会失足的。
以上就是在asp.net中运用JQuery Ajax相干用法总结的细致内容,更多请关注ki4网别的相干文章!