发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
我们来打造一个简单的专用于json调用的mvc实现,最终会将如下的C#代码暴露给js调用(代码在最后面有下载):
public class UserController { public static Json GetUser( [HttpQueryString("x_user")] int userId, [HttpQueryString("msg")] string msg) { Json json = new Json(); json.IsSuccess = true; json.Data = new { Field1=userId, Field2=msg }; return json; } }
上面这些用到的class,如:Json, HttpQueryString之类的都是自己写的,不是asp.net mvc的类。
(HttpQueryString("x_user")代表修饰的变量userId的值是从QueryString集合中获取的,并且key为x_user,怎么样,够容易理解的吧)
配置文件中还要加入相应的HandlerFactory(代表符合ajax/*.ashx的路径都会被MvcHandlerFactory处理,目前只实现了JsonHttpHandler):
<httpHandlers> <add type="Mvc.Factories.MvcHandlerFactory, Mvc" path="ajax/*.ashx" verb="*"/> </httpHandlers>
入口找到了,就好办了,我们来看看这个MvcHandlerFactory:
public class MvcHandlerFactory:IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) { ControllerDescriptor controllerDescriptor = ControllerFactory.Resolve(context); //解析当前请求的ControllerDescriptor if (controllerDescriptor == null) throw new Exception("没有找到相应的Controller"); MethodDescriptor methodDescriptor = MethodFactory.Resolve(controllerDescriptor, context);//解析当前请求的MethodDescriptor if (methodDescriptor == null) throw new Exception("没有找到相应的调用方法"); IHttpHandler handler = new JsonHttpHandler(controllerDescriptor, methodDescriptor);//由于目前只做了Json处理器,因此直接硬编码此类 return handler; } public void ReleaseHandler(IHttpHandler handler) { throw new NotImplementedException(); } }
完成下面这些工作:
再来看看JsonHttpHandler:
public class JsonHttpHandler:IHttpHandler { private ControllerDescriptor controllerDescriptor; private MethodDescriptor methodDescriptor; private JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();//用了ms的json序列化器 public JsonHttpHandler(ControllerDescriptor controllerDescriptor, MethodDescriptor methodDescriptor) { this.controllerDescriptor = controllerDescriptor; this.methodDescriptor = methodDescriptor; } public bool IsReusable//无所谓里面的返回值,ms用不到这个value,都是false { get { throw new NotImplementedException(); } } public void ProcessRequest(HttpContext context) { MethodInfo mi = this.controllerDescriptor.ControllerType.GetMethod(this.methodDescriptor.MethodName); List<object> parameters = new List<object>(); foreach (var pd in this.methodDescriptor.ParameterDescriptors) { object value = ParameterParser.GetValue(context, pd);//遍历all参数,并且从相应的location取值 parameters.Add(value); } object result=mi.Invoke(null, parameters.ToArray());//调用具体Controller中的函数,由于是静态函数,因此传入了null作为instance string json=jsonSerializer.Serialize(result);//序列化为json字符串 context.Response.Write(json); } }
还需要在global中增加搜索所有Controller后缀的class到注册Dictionary中,这里就是些遍历,大家可以看代码,代码就不贴了
目前这个框架是简陋的,不过也看到了有很多能插入的点,比如[RequestLimit(HttpRequestType.Post)]等,大家懂的。
一旦自己能深入到框架内部,许多难题就不再是难题了,可以很快解决。
附上vs2012写的代码(家里电脑只有vs2012,没有vs2010...)
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
JAVA版微信支付V3-完全版
public static String MD5Encode(String origin, String charsetname) { String resultString = null;Map<String, String> ...
asp.net remoting 学习
网上很多这样的实例.有兴趣的可以查找一下.刚接触remoting .还在学习中 http://www.cnblogs.com/daniel206/archive/2007/08/27/871075.html 简单的Remoting例子 http://www.cnblogs.com/chjun2000/a...
Android自动化测试之MonkeyRunner
wait(long millis, int nanos)Causes the calling thread to wait until another thread calls thenotify() ornotifyAll() method of this object or until the specified timeout expires.The default...
一起学Android之Xml与Json解析
6 7 private Handler handler=new Handler(){ 8 @Override 9 public void handleMessage(Message msg) {10 switch (msg.what){11 case MSG_FINISH:12 List<String> lstContent=(List<String...
3.4 其他静态工具函数
window.jQuery = _jQuery;// jQuery.type(obj) !// 因为整个jQuery代码都是一整个匿名函数,所以当前context是jQuery,如果要将上下文设置为window则需使用globalEval。&& ( ( length >0 &a...
Clicks // Pebble Developers
void config_provider(Window *window) { // single click / repeat-on-hold config: window_single_click_subscribe(BUTTON_ID_DOWN, down_single_click_handler);// long click config: window_long_...
SAP SAP Data Intelligence Graph json源代码的结构分析
SAP SAP Data Intelligence Graph json源代码的结构分析。以SAP Data Intelligence标准的示例Graph com.sap.demo.http.server为例,将其...
Ext框架学习 (三) Ext.Ajax类
Ext框架学习 (三) Ext.Ajax类。Global Ajax request class.Ajax.request({An object containing request headers which are added to each request made by this object. (defaults to undefined)An ob...
struts2中ognl表达式 各种合集
为了解决数据从View层传递到Controller层时的不匹配性,Struts2采纳了XWork的OGNL方案。并且在OGNL的基础上,构建了OGNLValueStack的机制,从而比较完美的解决了数据流转中的不匹配性。 O...
微信扫码,在手机上查看选中内容