zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CF710F String Set Queries(AC自动机+二进制分组)
    P5231 [JSOI2012]玄武密码(AC自动机)
    AC自动机基础&应用
    [SDOI2011]计算器(快速幂,线性同余方程,BSGS)
    数论——欧拉定理和费马小定理
    AtCoder Beginner Contest 173 题解
    【CSP2019】树的重心(树的重心、倍增、换根)
    CF708C Centroids(换根dp,树的重心)
    凸包(Graham与Andrew算法求凸包)
    [USACO10MAR]Great Cow Gathering G(换根dp)
  • 原文地址:https://www.cnblogs.com/StevenChennet/p/4030618.html
Copyright © 2011-2022 走看看