function get_org(id) {
            var url = "/Handler/AjaxHandler.ashx";
            var post_data = '{ id: "'+id+'" }'; //这里拼接一个字符串格式的JSON就可以了。如果频繁操作的话,可以考虑使用jquery.json或者自己写个方法,把josn对象转换为字符串的表达式。
            $.ajax({
                url: url,
                type: "POST",
                dataType: "json",
                data: { action: "CallAjax", asm:"Framework.Web",className:"AjaxDemo", form: [post_data] },//<span style="color: rgb(255, 0, 0);">我在这里通过form这个参数传递过去的,但是在接收的时候是个null</span>
                success: function (data) {
                    if (data != null && data != "") {
                        alert(data);
                    }
                },
                error: function (XMLHttpRequest, textStatus) {
                    alert("异常:" + XMLHttpRequest.reponseText + ";Status:" + textStatus);
                }
            });
        }
 

解决方案 »

  1.   

    楼主 你的  param 有值没?
    没有的话  按楼上的传json字符串吧
      

  2.   

    这样拼接后,我在前端var post_data="{'id':'" + id + "'}";后面alert(post_data)出来的数据是对的,但是data:{action:"CallAjax",sam:"",className:"",form:[post_data] //这里的form传递到Handler.ashx里面用context.Request.Form["form"]获取到的是null
      

  3.   

    我按1楼的方法传,获取到的param也是null
      

  4.   

    我按1楼的方法,在后台断点监视看到的context.Request.Form["form"]得到的是form[]
      

  5.   

    我看你第一个
    string action = context.Request.Form["method"]这里应该是action吧。
    方法没有问题,我试了。不过你的这种设计实在很危险,客户端请求服务器通过反射执行动作,很容易被注入危险代码啊。
      

  6.   

    .ashx文件下把context.Response.ContentType = "text/plain"; 这个改成context.Response.ContentType = "application/json";试试
      

  7.   


     参数和接受参数都不同 。你觉得你能接到吗?
     
     data: { action: "CallAjax",asm:"Framework.Web",className:"AjaxDemo", form: [post_data]            string action = context.Request.Form["method"]; XXXXXXXXXXXX
                string assemblyName = context.Request.Form["asm"];
                string className = context.Request.Form["className"];
                string param = context.Request.Form["form"];
    另外你这个form的[post_data] 又是什么东西?
      

  8.   


    我之前也都是客户端传方法 在服务器端反射执行该方法,能否举一个被注入的例子
    那如果不用这种反射方法,如何设计能让前台ajax安全方便的访问ashx后台的代码呢??如果看到请回复下,谢谢哈!
      

  9.   

    哎呀  看了LZ的参数 你怎么程序集和类名都给包含了呢。。的却是挺不安全的我有一篇文章是写ajax访问ashx反射执行方法的,可以看下
    在ashx中利用反射+jquery轻松处理ajax 含Demo源码
      

  10.   


    看了你的这篇文章,你这样还是会一个页面要对应一个ashx文件,那样一个项目里用ajax的多了,得要添加很多个ashx文件。我的这个是整个项目里只有一个ahsx文件,所有的ajax请求都通过这一个ashx拦截,对应到相关的程序集里反射调用对应的方法
      

  11.   


    一般都是按类别来新建ashx文件的
    比如用户处理类 里面的注册 登录 更改密码 更新信息都是可以放在一个ashx文件中的
    而且这种方式都是用于中小 网站的,一个网站的操作类别也不会很多
    还有我再问你下  像你那样做不同样是cs文件变很多么????不一样的道理么
    你这样的设计 别人只要知道你的命名空间和方法名 他们就能通过你的ashx来执行你的方法了
    你的ashx权限太大了  没发现吗??
      

  12.   

    你ashx内 反序列化下json字符串不就行了吗?public static T JsonDeserialize<T>(string jsonString){                   var serializer = new JavaScriptSerializer();       return serializer.Deserialize<T>(jsonString);}
      

  13.   

    "还有我再问你下  像你那样做不同样是cs文件变很多么????不一样的道理么
    你这样的设计 别人只要知道你的命名空间和方法名 他们就能通过你的ashx来执行你的方法了"

    关于第一点:我整个项目里只有一个ashx文件,这个文件里调用的方法都是aspx页面的cs代码,不需要建立很多ashx文件,比如我的登录页面,我在aspx.cs里有一个Login的方法,我的ashx文件反射调用的就是通过js传过来的方法名:Login;如果注册页面也要用ajax的话,也是通过ashx调用regester.aspx.cs里的Register方法;
    第二点:程序集的名称肯定是封闭不会在前端的js里显示传递的,在实际项目中肯定是写在配置文件中,前端的js实际上传的只有类名和调用的方法名
      

  14.   

    你对调用的方法并没有任何限制,简单说我完全可以调用System.IO.Directory.Delete("/*.*"),后果你知道?如果只是需要调用仅仅几个有限的方法,这种设计就太繁琐了。比如Login,你浏览器完全可以直接提交给Login页面或者处理页面。
      

  15.   


    lz他可以判断反序列出来的 p 是否实现了某个接口,甚至调用这个接口里的内容来进行权限判断。而lz自己的代码并不需要修改一行,仅需要扩展一行就行了。
      

  16.   

    有很多种设计方式。比如你可以为所有的命令class(不管它封装在哪一个工程DLL中)都写上一个Attribute,来说明它可以作为Command使用。然后在执行 JsonConvert.DeserializeObject(param) 之前,可以先得到这个param对应的type,判断其是否真的是命令处理程序(使用IsAssignableFrom 方法),如果是命令处理程序那么才反序列化。这就不存在“没有限制”的问题了。因为客户端发送了一个请求,就要把请求传递给命令处理程序。并不会反序列化那些除命令处理程序以外的对象。
    而关于“这种设计太繁琐”,其实正相反。这才轻巧地三四条代码,可以将解决方案中几十个、上百个,以及不断增加的命令处理程序自动反射出来,自动执行,实在是一种相当精巧和完全可扩展的做法。
      

  17.   

    例如你可以为Command定义一个通用的结构,例如json{
        passportId: 223323,
        commandName: "ABC.PaychecksToEmployee",
        commandData: {
                          UserName: "张三",
                          Year: 2013,
                          Month: 2
                     },
     }这样,服务器端可以根据commandName到所有命令类型中查找到相应的命令,然后将commandData反射为这个命令对象,执行这个命令,再将结果通过context输出给客户端。
                          
      

  18.   


    请教下 如果按LZ的设计  在已有的程序下  
    用户如何注入能够调用System.IO.Directory.Delete("/*.*")这个方法呢
      

  19.   

    context.Request.Form["xx"] 呵呵 用 context.Request["xx"]吧   分给我?
      

  20.   


    我现在的设计就是像您说的一样的。
    其实我的前端传递的json数据里还包含有一个参数类型,ParamDataType,而且实际的参数值ParamData是在Framework.Model.Data里定义好了的,最终根据前端传过来的参数会反序列化成对应的Model.Data里的对象;而且,我反射调用的方法都是打了Attribute的,如果你调用的不是我自定义的打了Attribute的方法,是根本不会执行的。
      

  21.   

    这个例子对我有帮助。
    http://www.suchso.com/UIweb/jquery-ajax-post-array-csharp-json.html