首页 > 代码库 > HttpContext的dynamic包装器DynamicHttpContext (附原代码)

HttpContext的dynamic包装器DynamicHttpContext (附原代码)

项目背景:在.net framework下使用asp.net webform,特别是aspx+ajax+ashx中,ashx后台代码获取传入参数的时候,需要很多[“…”],我用dynamic对他进行包装。

废话不多说,上代码(文章最下面有上传打包代码):

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace MyWebDemo{    public partial class UserList : System.Web.UI.Page    {        /// <summary>        /// StevemChennet@live.com qq:38798579        /// http://www.cnblogs.com/stevenchennet        /// </summary>        protected void Page_Load(object sender, EventArgs e)        {            //             // 这是以前的做法,这些["parameter"]很费劲            //            //HttpContext context = HttpContext.Current;            //if (!this.IsPostBack)            //{            //    // http://localhost:20000/UserList.aspx?id=1&name=StevenChennet            //    int id = int.Parse(context.Request.Params["id"]);            //    
// string name = context.Request.Params["nAMe"]; // this.lbl.InnerText = string.Format("Get提交 id:{0} name:{1}", id, name); //} //else //{ // // form post // int age = int.Parse(context.Request.Form["age"]); // string address = context.Request.Form["AddRESS"]; // this.lbl.InnerText = string.Format("Post提交 age:{0} address:{1}", age, address); //} dynamic dContext = new DynamicHttpContext(HttpContext.Current); if (!this.IsPostBack) { // http://localhost:20000/UserList.aspx?id=1&name=StevenChennet int id = dContext.id; // nAMe也可以用Name,忽略大小写的,这里故意写成nAMe意思是忽略大小写。
string name = dContext.nAMe; this.lbl.InnerText = string.Format("Get提交 id:{0} name:{1}", id, name); } else { // form post int age = dContext.Age; string address = dContext.AddRESS; this.lbl.InnerText = string.Format("Post提交 age:{0} address:{1}", age, address); } } }}

  

下面是实现的代码

 

using System;using System.Collections.Generic;using System.Dynamic;using System.Linq;using System.Web;namespace System.Web{    /// <summary>    /// StevemChennet@live.com qq:38798579    /// http://www.cnblogs.com/stevenchennet    /// </summary>    public class DynamicHttpContext : DynamicObject    {        private string keyContent;        private HttpContext httpContext;        public DynamicHttpContext(HttpContext context)        {            this.httpContext = context;        }        public override bool TryGetMember(GetMemberBinder binder, out object result)        {            string key = binder.Name;            if (httpContext.Request.HttpMethod == "GET")            {                this.keyContent = this.httpContext.Request.QueryString.Get(key);            }            else            {                this.keyContent = this.httpContext.Request.Form.Get(key);            }            result = this;            return true;        }        public override bool TryConvert(ConvertBinder binder, out object result)        {            result = null;            Type binderType = binder.Type;            //int            if (binderType == typeof(int))            {                result = int.Parse(this.keyContent);            }            else if (binderType == typeof(int?))            {                if (string.IsNullOrWhiteSpace(this.keyContent))                {                    result = int.Parse(this.keyContent);                }                else                {                    result = default(int?);                }            }            // bool            else if (binderType == typeof(bool))            {                result = bool.Parse(this.keyContent);            }            else if (binderType == typeof(bool?))            {                if (string.IsNullOrWhiteSpace(this.keyContent))                {                    result = bool.Parse(this.keyContent);                }                else                {                    result = default(bool?);                }            }            // datetime            else if (binderType == typeof(DateTime))            {                result = DateTime.Parse(this.keyContent);            }            else if (binderType == typeof(DateTime?))            {                if (string.IsNullOrWhiteSpace(this.keyContent))                {                    result = DateTime.Parse(this.keyContent);                }                else                {                    result = default(DateTime?);                }            }            // string            else if (binderType == typeof(string))            {                result = this.keyContent;            }            else            {                throw new NotSupportedException(string.Format("类型 {0} 还未实现,请添加转换代码", binderType.ToString()));            }            return true;        }    }}
 

 

 

 

-----------------------利益相关:.net软狗一枚,济南工作,qq:38798579,欢迎同道朋友骚扰。----------------------

代码打包下载(VS2013)

http://files.cnblogs.com/StevenChennet/AppDomainPerformanceDemo.zip

HttpContext的dynamic包装器DynamicHttpContext (附原代码)