steel grating

导航

响应不同的Ajax请求,您是怎么做的?

Posted on 2009-05-17 00:15  在别处  阅读(3466)  评论(30编辑  收藏  举报
使用Jquery发送请求,服务端用ashx文件来处理客户端的请求, 最开始的时候像下面的情形:
1、$.get("getName.ashx",{id:12345},function(data){});

2、$.post("setName.ashx",{name:"Zaibiechu"},function(data){});


一个请求对应一个ashx文件,项目做久了,于是产生了一堆的ashx文件,自然觉得不是一个好办法。再接下来就把一些相关的请求放到同一个文件中来,而客户端通过发送一个“cmd”参数,来请求相应的方法,如下: 

1、$.get("nameMethod.ashx",{cmd:"getName",id:12345},function(data){});

2、$.post("nameMethod.ashx",{cmd:"setName",name:"Zaibiechu"},function(data){});


服务器端处理: 

public class nameMethod : IHttpHandler {
   
public void ProcessRequest (HttpContext context) {
        context.Response.ContentType 
= "text/plain";
        
if (context.Request["cmd"!= null)
        {
            
string cmd = context.Request["cmd"];
            
switch (cmd)
            {
                
case "getName": GetName(context); break;
                
case "setName": SetName(context); break;
                    .                    
            }
        }
    }


    
public void GetName(HttpContext context)
    {
        
    }

   
public void SetName(HttpContext context)
    {
        
    }

.      

}

这样文件是省了不少,但是一堆case,看上去还是别扭,怎么才可以看上去更好点呢。琢磨了一阵,想到了反射,遂将后台方法修改如下:

public class nameMethod : IHttpHandler {
    
    
public void ProcessRequest (HttpContext context) {
        context.Response.ContentType 
= "text/plain";
        
if (context.Request["cmd"!= null)
        {
            
string cmd = context.Request["cmd"];
            var method 
= this.GetType().GetMethod(cmd);
            
if (method != null)
            {
                method.Invoke(
thisnew object[]{ context});
            }
        }
    }


    
public void GetName(HttpContext context)
    {
         

    }

   
public void SetName(HttpContext context)
    {
         
    }  

}

  

看上去似乎“优雅”多了,我能想到的处理方法就是这样,但总觉得这土生土长的方法,是不是一个好的解决方案呢,想听听大家的意见,你们在处理这个问题上是怎么做的呢,请不吝赐教。