在项目开发中难免存在大量的判断语句,特别是在频繁使用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下载有需要的可以下载来看,里面还有个省份-市区数据库: