现在的位置: 首页 > 综合 > 正文

利用反射减少if等重复代码,省市下拉框,数据库,代码优化

2013年09月17日 ⁄ 综合 ⁄ 共 9562字 ⁄ 字号 评论关闭
 

在项目开发中难免存在大量的判断语句,特别是在频繁使用ajax与服务器交互的项目中,if,switch等判断语句的使用量是相当大的,为了在项目开发过程减少这类代码的使用量,我使用了反射。
 
该页面是Ajax回发处理的公共页面Process.aspx,由此可见这样重复写代码是十分令人厌恶的:
switch (Request["action"].ToString())
        {
            case "city":
                InitCity(iType);
                break;
            case "city1":
                InitCity1(iType);
                break;
            case "city2":
                InitCity2(iType);
                break;
            case "ChangeEnter":
                ChangeEnter();
                break;
            case "UpdateTime":
 
                UpdateTime();
                break;
            case "FeedbackList":
                FeedbackList();
                break;
            case "MessageBoardList":
                MessageBoardList();
                break;
            case "WantsList":
                WantsList();
                break;
            case "iStateChange":
                iStateChange();
                break;
            case "seliWorkType":
                seliWorkType();
                break;
            case "Del":
                Del();
                break;
            case "jobwill":
                SaveJobWill();
                break;
            case "callmode":
                SaveCallMode();
                break;
            case "goodskill":
                SaveGoodSkill();
                break;
            case "state":
                SaveState();
                break;
            case "wantwork":
                WantWork();
                break;
            case "Resumes":
                Resumes();
                break;
        }
为了减少大家在开发过程中重复写类似的代码,这里使用了反射。
下面提供一个例子,全国省份的二级联动菜单:
 
 
1.首先创建一个专门处理Ajax回发事件的类库
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using DBUtility;
 
namespace Re_Demo.AjaxProcess
{
    public class City
    {
        StringBuilder strHtml = new StringBuilder();
 
        #region测试
        public string Test()
        {
            return "hello world!";
 
        }
        #endregion
 
        #region测试
        public string Test_111(int a,string b)
        {
            return a.ToString() + b;
 
        }
        #endregion
 
        #region测试asdasdasd
        public string Test_111r3r43()
        {
            return "hello world!aaabbfredbdrfa";
 
        }
        #endregion
       
        #region根据省份填充市
        ///<summary>
        ///填充市
        ///</summary>
        ///<param name="iParent">省份ID</param>
        ///<returns></returns>
        public string InitCity(int iParent)
        {
            using (SqlDataReader rdr = SqlHelp.ExecuteReader(SqlHelp.ConnectionStringLocalTransaction, CommandType.Text, "select AutoCode,sName from S_City where iParentID=" + iParent, null))
            {
                strHtml.Append("城市:<select id='ddlCity'>");
                strHtml.Append("<option value='0'>---请选择---</option>");
 
                while (rdr.Read())
                {
                    strHtml.Append("<option value='" + rdr["AutoCode"].ToString() + "'>" + rdr["sName"].ToString() + "</option>");
                }
            }
            strHtml.Append("</select>");
            return strHtml.ToString();
        }
 
        #endregion
 
       
    }
}
 
2.数据访问类:
namespace DBUtility
{
    public abstract class SqlHelp
    {
        public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["SQLDemo"].ConnectionString;
        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText,
            params SqlParameter[] cmmandParameters)
        {
            SqlCommand cmd = new SqlCommand();
            SqlConnection con = new SqlConnection(connectionString);
            try
            {
                PrepareCommand(cmd, con, null, cmdType, cmdText, cmmandParameters);
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                con.Close();
                throw;
            }
        }
 
 
        private static void PrepareCommand(SqlCommand cmd, SqlConnection con, SqlTransaction trans, CommandType cmdtype, string
            cmdText, SqlParameter[] cmdparms)
        {
            if (con.State != ConnectionState.Open)
                con.Open();
            cmd.Connection = con;
            cmd.CommandText = cmdText;
 
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = cmdtype;
 
            if (cmdparms != null)
                foreach (SqlParameter parm in cmdparms)
                    cmd.Parameters.Add(parm);
        }
    }
}
 
3.前台AjaxProcess.aspx页面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxProcess.aspx.cs" Inherits="AjaxProcess" %>
.CS页面
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Reflection;
using System.Text;
 
public partial class AjaxProcess : System.Web.UI.Page
{
    string action;
    string itype;
    string classname;
    string iParent;
    int index;
    object[] obj_parameters;
    ParameterInfo[] paramterinfo;
    
    readonly string path = ConfigurationManager.AppSettings["AjaxProcess"];
 
    protected void Page_Load(object sender, EventArgs e)
    {
      
        //获取查询参数
        action = Request["action"] != null ? Request["action"] : null;
        itype = Request["itype"] != null ? Request["itype"] : null;
        iParent = Request["iParent"] != null ? Request["iParent"] : null;
 
        //动态调用方法
        classname = path + "." + action;
        object obj = Assembly.Load(path).CreateInstance(classname);
        Type mytype = obj.GetType();      
        MethodInfo m = mytype.GetMethod(itype);       
        if (m.GetParameters().Length > 0)
        {
            paramterinfo = m.GetParameters();
            obj_parameters = new object[m.GetParameters().Length];
            string[] parameters = new string[] { };
            if (iParent.IndexOf("|") != -1)
            {
                parameters = iParent.Split('|');
                for (int i = 0; i < paramterinfo.Length; i++)
                {
                    Get_Type(parameters[i], paramterinfo[i]);
                }              
            }
            else
            {
 
                Get_Type(iParent, paramterinfo[0]);
            }
            Response.Write(m.Invoke(obj, obj_parameters));
        }
        else
            Response.Write(m.Invoke(obj, null));       
       
    }
 
 
    private void Get_Type(string par, ParameterInfo paramterinfo)
    {
 
        switch (paramterinfo.ParameterType.ToString())
        {
            case "System.String":
                obj_parameters[index] = par;
                break;
            case "System.Int32":
                obj_parameters[index] = int.Parse(par);
                break;
        }
        index++;                  
    }
}
 
 
3.前台Demo页面.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DEMO.aspx.cs" Inherits="DEMO" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  
    <title>无标题页</title>
    <script type="text/javascript" language="javascript">
   
        var xmlHttp;
        function $(a){
             return document.getElementById?document.getElementById(a):null;
        }
 
        function CreateXmlHttp()
        {
            try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
     catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
     catch (e) { try { xmlHttp = new XMLHttpRequest(); }
     catch (e) { xmlHttp = false; }}}
        }
        function AjaxProcess(url,id)
        {
            CreateXmlHttp();   
            xmlHttp.open("POST",url);
            xmlHttp.onreadystatechange=function()
            {
                if(xmlHttp.readyState==4)
                {                 
                    $(id).innerHTML=xmlHttp.responseText;                                                                   
                }          
            }
            xmlHttp.send(null);
        }
       
        function ChangeProvince()
        {   
//            + $("ddProvince").value
            var id=$("divCity");          
            var url="AjaxProcess.aspx?action=City&iParent=3232|vfdvdf" + "&itype=Test_111";              
            AjaxProcess(url,"divCity");
        }                              
                      
    </script>
 </head>
<body>
    <form id="form1" runat="server">                   
           省份:<asp:DropDownList ID="ddProvince" runat="server" onchange="ChangeProvince();"></asp:DropDownList><br /><br />
           <span id="divCity"></span>                             
             <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TP_ZDConnectionString %>"
                 SelectCommand="SELECT AutoCode, sName FROM S_Province"></asp:SqlDataSource>                                       
    </form>
</body>
</html>
后台.cs页面:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Drawing;
using System.Reflection;
 
public partial class DEMO : System.Web.UI.Page
{
    protected DataRow EnterDR;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ProCity();
        }
    }
  
    public void ProCity()
    {
        ddProvince.DataSource = SqlDataSource1;
        ddProvince.DataTextField = "sName";
        ddProvince.DataValueField = "AutoCode";
        ddProvince.DataBind();
        ListItem item = new ListItem("---请选择---", "");
        ddProvince.Items.Insert(0, item);
    }  
}
 
(以上代码经过研究发现有不完善的地方还请参照:http://topic.csdn.net/u/20080625/10/81332ade-8e16-4e1d-a57b-c4aa92355236.html自行修改)
上面写的不清楚,也许会纯在些遗漏,下面提供一个demo下载有需要的可以下载来看,里面还有个省份-市区数据库:

抱歉!评论已关闭.