.net中使用Ajax

来源:互联网 发布:ps软件的使用方法 编辑:程序博客网 时间:2024/05/27 19:27

在.net中使用Ajax传递数据的话,一般使用ashx或asmx作为后台的处理文件,那么这2种文件在使用时有何区别呢。

1.使用ashx处理

用ashx时,在后台取参数时一般都是使用HttpContext.Request.Param["参数名"]来获取参数的,如果想多个ajax调用同一个ashx的话,可以在参数里加上比如optype的值来表示该调用哪个方法。

前端方法

<script language="javascript" type="text/javascript">$(document).ready(function () {$.ajax({url: "ashxtest1.ashx",type: "post",/*注意这里是json对象,ajax会将其转换成optype=add的格式,这样在后台就可以使用context.Request.Params["optype"]获取值了。如果这里是一个字符串的话那么后台需要使用context.Request.Params[0]来获取值,不方便使用,最好还是传入json对象便于后台获取传入的参数。如果需要传入较复杂的参数的话,可以这样data: { "optype": "add","param":Json.stringfy({"name":"wang","year":26}) }后台获取到param后可以使用反序列话插件将字符串转换为对象比如LitJson或Newtonsoft*/data: { "optype": "add", "param": JSON.stringify({ "name": "wang", "year": 26 }) },/*这个设置是告诉ajax在获取到返回值,将返回值转化成什么格式,如果转换失败则会进入error*/dataType: "json",/*contentType代表使用什么格式将数据从前端发送到服务器,比如text/plain,text/html,text/xml,text/javascript,application/jsoncontentType不设置,Ajax默认会用application/x-www-form-urlencoded,适合大多数使用情况了对于上面常用的5种方式,这种data格式都没有问题,所以可以设置也可以不设置*/contentType: "application/json; charset=utf-8",success: function (returnData) {alert('success');},error: function (e, r, t) {//error的话这里会有3个参数传进来alert('error');},complete: function () {//不管是访问成功或失败都会调用此方法}});});</script>
后台方法

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace AjaxAshx.Test{    /// <summary>    /// ashxtest1 的摘要说明    /// </summary>    public class ashxtest1 : IHttpHandler    {        public void ProcessRequest(HttpContext context)        {            context.Response.ContentType = "text/plain";            string strOpType="";            //ajax中如果data为json对象可以这样获取到参数            if (context.Request.Params["optype"] != null)            {                strOpType = context.Request.Params["optype"].ToString();            }            //ajax中如果data为字符串的话需要通过index获取参数,不方便使用            strOpType = context.Request.Params[0].ToString();            //返回这个的话,由于ajax的dataType=json,所以会在返回值后转换失败,进入error方法            //context.Response.Write("helloworld");             //这个返回值可以正确的转换为json,进入success方法            context.Response.Write("{\"word\":\"helloworld\"}");            context.Response.Flush();        }        /// <summary>        /// 这个是必须的        /// </summary>        public bool IsReusable        {            get            {                return false;            }        }    }}

根据前面的分析使用ashx的好处是,前台传递参数使用json,后台可以比较方便的获取参数;基本不需要考虑contentType的影响;后台返回的值就是前台的得到的值。

2.使用asmx处理

前台方法

<script language="javascript" type="text/javascript">$(document).ready(function () {$.ajax({/*使用asmx需要在url后面直接指定访问后台的哪个方法*/url: "asmxtest1.asmx/HelloWorld",type: "post",/*用asmx的话这里对data的格式就会有要求了,.net内部机制不是很清楚,应该是根据contentType会对data进行一个验证,验证不通过的会调用失败,下面列举了常用的几种类型1.contentType不设置:这时会默认使用application/x-www-form-urlencoded,这个时候data需要为一个json对象,对象中的key值需要与后台方法中传入参数一致,可以多但是不能少。<span style="color:#ff0000;">这种情况下后台返回值会是xml格式,使用时注意dataType的设置</span>。2.contentType=text/xml,data需要为一个正确格式的xml字符串3.contentType=application/json,data需要为一个代表json格式的字符串而不是一个json对象,比如'{"param":1}'或者'{"param":"{\\"name\\":\\"aa\\"}"}'这种复杂格式注意里面需要双斜杠。<span style="color:#ff0000;">这种情况后台返回值为json格式,会将返回的值放在一个d的对象里面</span>*/data: '{"param":"{\\"name\\":\\"aa\\"}"}',//data: { param: JSON.stringify({ "name": "aa" }) },dataType: "json",contentType: "application/json; charset=utf-8",success: function (returnData) {alert('success');},error: function (e, r, t) {//error的话这里会有3个参数传进来alert('error');},complete: function () {//不管是访问成功或失败都会调用此方法}});});</script>
后台方法

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;namespace AjaxAshx.Test{    /// <summary>    /// asmxtest1 的摘要说明    /// </summary>    [WebService(Namespace = "http://tempuri.org/")]    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]    [System.ComponentModel.ToolboxItem(false)]    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。    //这里一定注意要去掉注释    [System.Web.Script.Services.ScriptService]    public class asmxtest1 : System.Web.Services.WebService    {        [WebMethod]        public string HelloWorld(string param)        {            return "{\"flag\":1}";        }    }}

使用asmx的话需要特别注意contentType的设置,还有对返回值的处理。综合比较,如果没有特殊要求一定要用asmx的话,使用ashx会比较简单点。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 把货退了卖家不退款怎么办? 退款了又收到货怎么办 退货忘了填单号怎么办 手机换号了淘宝怎么办 换了手机支付宝怎么办 手机丢了微信登不上去了怎么办 前面手机丢了微信登不上去怎么办 淘宝密码忘了怎么办呢 融e借逾期一天怎么办 拼多多处罚下架怎么办 永久无法解绑支付宝怎么办 淘宝下单购买人数太多怎么办 新浪微博被拉黑暂时无法评论怎么办 闲鱼交易成功后卖家反悔怎么办 闲鱼买家不申请介入怎么办 支付宝安装不上怎么办 无线摄像机离wifi太远怎么办 安卓系统死机了怎么办 安卓手机开不了机怎么办 手机关机键坏了怎么办 华为手机接听电话声音小怎么办 小米6x游戏闪退怎么办 安卓8.0不兼容怎么办 安卓8.0应用闪退怎么办 安卓8.0不兼容的怎么办 游戏全屏只有一个分辨率选项怎么办 安卓6.0吃运行内存怎么办 小米手机王者荣耀录像不支持怎么办 win764位系统不兼容怎么办 安卓版本太高不兼容怎么办 安卓3.2.0不兼容怎么办 手机卡和手机不兼容怎么办 vivo手机下载吃鸡不兼容怎么办 vivox3t不兼容支付宝怎么办 移动sim卡坏了怎么办 cpu和主板不兼容怎么办 主板与cpu不兼容怎么办 cpu跟主板不兼容怎么办 软件与电脑不兼容怎么办 win8系统无限重启怎么办 安装微信旧版本登录提示升级怎么办