一步一步asp.net_三层构架的学习
總結一下現在做的項目,由于混亂的項目經驗,我就全部重新寫了以前的一個項目,搭建的是簡單三層架構的模式,簡單三層是我第一個認識的架構層次的理念,也是影響非常深的,以前只是理論的學學什么設計模式,什么mvc,但是這些根本太遙遠,因為沒有編碼經驗,沒有項目經驗,永遠也無法體會架構之美,更有甚者,認為這些架構太復雜了,還要花時間,仍然是那種業務數據UI混合的模式,然后混雜大量的增刪改查,再加上大量的ctrl+c或者ctrl+v的代碼,以至于面向對象的東西,做了大半年除了封裝類,沒有什么跟面向對象有關系的了.....純屬面向過程+class的模式.那么什么是面向對象,這個問題,太難回答了,面向對象,簡單地說就是拿人的思維去解決問題.
? 人的思維是復雜的,因此,有了復雜的分工,因此我們在學習面向對象的時候更重要的是想象著,
人怎么做?
回歸正題:三層構架
三層構架,說到底就是一個簡單的分層概念,一個數據訪問層,業務邏輯層,和UI層,而我們經常見到的,
BLL就是業務邏輯層,DAL就是數據訪問層,czcraft網站就是所謂的UI層,而Model是什么呢?這和MVC的model又有什么區別?
model其實就是實體層,因為為了在BLL和DAL以及Ui層傳輸數據,我們要借助model這個實體層來傳輸數據,
比如我們注冊一個帳號信息,
我們可以把所有收集到的帳號信息,保存在一個member的實體類中,然后傳入給BLL處理.
BLL就是業務邏輯層,我們經常會遇到這樣一個現象:
一個asp.net WebForm界面,一個事件大量的代碼
這種代碼,如果一百個登錄是不是要復制一百份,當我們復制的第二次就要考慮怎么復用.
這時候我們想象,為什么要把這些業務寫到事件中?
我們首先要做的就是第一步分離,我們可以嘗試定義一個類的方式,這是第一步的分離,設計一個member類,里面封裝了,member的各種字段和方法,比如登錄,等等,
這是第一步的分離,這樣的好處就是可以復用方法,不用復制復制再次復制,但是這樣子邏輯和數據訪問仍然寫死在一個類中,如果我們要修改比如一個細節,
1.以前登陸都是明文,現在要加密,結果我們又要修改.
2.如果以前數據庫刪除一條會員信息,沒有做級聯刪除(比如關聯會員的其他信息,比如會員購買記錄的信息等),現在要增加,結果又是大量的修改.
為什么我們不分理出數據和操作,以及UI顯示?
我們分離出DAL,專門負責數據庫操作,不管業務邏輯,BLL只負責業務邏輯,
當然為了考慮多種數據庫的兼容設計,我們可以再加一層,IDAL接口層,
當然我們的數據庫操作類也最好設計成兼容多種數據庫的模式,
關于DAL,BLL,我就舉一個實例,比如會員信息,DAL的形式就是這樣,
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: using czcraft.Model; 6: using System.Data; 7: using System.Data.SqlClient; 8: using System.Data.Common; 9: namespace czcraft.DAL 10: /* 11: * 作者: Sweet 12: * 創建時間: 2012/5/5 10:13:44 13: * 類說明: czcraft.DAL 14: */ 15: { 16: ///<summary> 17: ///member表DAL 18: ///</summary> 19: public partial class memberDAL 20: { 21: DBO.DBOperator SqlHelper = DBO.DBOperator.instance(); 22: /// <summary> 23: /// 增加member 24: /// </summary> 25: /// <param name="model">tableName實體</param> 26: /// <returns>執行狀態</returns> 27: public int AddNew(member model) 28: { 29: string sql="insert into member(username,password,Sex,nation,mobilephone,Telephone,Email,qq,Zipcode,Address,states,VCode,VTime) output inserted.Id values(@username,@password,@Sex,@nation,@mobilephone,@Telephone,@Email,@qq,@Zipcode,@Address,@states,@VCode,@VTime)"; 30: int id=(int)SqlHelper.ExecuteScalar(sql 31: ,(DbParameter)new SqlParameter("username",model.username) 32: ,(DbParameter)new SqlParameter("password",model.password) 33: ,(DbParameter)new SqlParameter("Sex",model.Sex) 34: ,(DbParameter)new SqlParameter("nation",model.nation) 35: ,(DbParameter)new SqlParameter("mobilephone",model.mobilephone) 36: ,(DbParameter)new SqlParameter("Telephone",model.Telephone) 37: ,(DbParameter)new SqlParameter("Email",model.Email) 38: ,(DbParameter)new SqlParameter("qq",model.qq) 39: ,(DbParameter)new SqlParameter("Zipcode",model.Zipcode) 40: ,(DbParameter)new SqlParameter("Address",model.Address) 41: ,(DbParameter)new SqlParameter("states",model.states) 42: ,(DbParameter)new SqlParameter("VCode",model.VCode) 43: ,(DbParameter)new SqlParameter("VTime",model.VTime) 44: ); 45: return id; 46: } 47: /// <summary> 48: /// 更新member實體 49: /// </summary> 50: /// <param name="model">tableName實體</param> 51: /// <returns>執行狀態</returns> 52: public bool Update(member model) 53: { 54: string sql="update member set username=@username,password=@password,Sex=@Sex,nation=@nation,mobilephone=@mobilephone,Telephone=@Telephone,Email=@Email,qq=@qq,Zipcode=@Zipcode,Address=@Address,states=@states where id=@id"; 55: return SqlHelper.ExecuteNonQuery(sql 56: ,(DbParameter)new SqlParameter("Id",model.Id) 57: ,(DbParameter)new SqlParameter("username",model.username) 58: ,(DbParameter)new SqlParameter("password",model.password) 59: ,(DbParameter)new SqlParameter("Sex",model.Sex) 60: ,(DbParameter)new SqlParameter("nation",model.nation) 61: ,(DbParameter)new SqlParameter("mobilephone",model.mobilephone) 62: ,(DbParameter)new SqlParameter("Telephone",model.Telephone) 63: ,(DbParameter)new SqlParameter("Email",model.Email) 64: ,(DbParameter)new SqlParameter("qq",model.qq) 65: ,(DbParameter)new SqlParameter("Zipcode",model.Zipcode) 66: ,(DbParameter)new SqlParameter("Address",model.Address) 67: ,(DbParameter)new SqlParameter("states",model.states) 68: //,(DbParameter)new SqlParameter("VCode",model.VCode) 69: //,(DbParameter)new SqlParameter("VTime",model.VTime) 70: ); 71: } 72: /// <summary> 73: /// 刪除member 74: /// </summary> 75: /// <param name="id">id</param> 76: /// <returns>執行狀態</returns> 77: public bool Delete(int id) 78: { 79: return SqlHelper.ExecuteNonQuery("delete from member where id=@id", 80: (DbParameter)new SqlParameter("id",id)); 81: } 82: /// <summary> 83: /// 刪除member 84: /// </summary> 85: /// <param name="strID">strID,記得多個用,隔開</param> 86: /// <returns>執行狀態</returns> 87: public bool DeleteMoreID(string strID) 88: { 89: return SqlHelper.ExecuteNonQuery("delete from member where id in ("+strID+")"); 90: } 91: /// <summary> 92: /// 將DataRow轉化為Model實體 93: /// </summary> 94: /// <param name="row">DataRow信息</param> 95: /// <returns>執行狀態</returns> 96: private static member ToModel(DataRow row) 97: { 98: member model=new member(); 99: model.Id =row.IsNull("Id")?null:(System.Int32?)row["Id"]; 100: model.username =row.IsNull("username")?null:(System.String)row["username"]; 101: model.password =row.IsNull("password")?null:(System.String)row["password"]; 102: model.Sex =row.IsNull("Sex")?null:(System.String)row["Sex"]; 103: model.nation =row.IsNull("nation")?null:(System.String)row["nation"]; 104: model.mobilephone =row.IsNull("mobilephone")?null:(System.String)row["mobilephone"]; 105: model.Telephone =row.IsNull("Telephone")?null:(System.String)row["Telephone"]; 106: model.Email =row.IsNull("Email")?null:(System.String)row["Email"]; 107: model.qq =row.IsNull("qq")?null:(System.String)row["qq"]; 108: model.Zipcode =row.IsNull("Zipcode")?null:(System.String)row["Zipcode"]; 109: model.Address =row.IsNull("Address")?null:(System.String)row["Address"]; 110: model.states =row.IsNull("states")?null:(System.String)row["states"]; 111: model.VCode =row.IsNull("VCode")?null:(System.String)row["VCode"]; 112: model.VTime =row.IsNull("VTime")?null:(System.DateTime?)row["VTime"]; 113: return model; 114: } 115: /// <summary> 116: /// 根據id獲取tableName實體信息 117: /// </summary> 118: /// <param name="id">id</param> 119: /// <returns>執行狀態</returns> 120: public member Get(int id) 121: { 122: DataTable dt=SqlHelper.ExecuteDataTable("select * from member where id=@id", 123: (DbParameter)new SqlParameter("id",id)); 124: if(dt.Rows.Count>1){ 125: throw new Exception("more than 1 row was found"); 126: } 127: if(dt.Rows.Count<=0){return null;} 128: DataRow row=dt.Rows[0]; 129: member model=ToModel(row); 130: return model; 131: } 132: /// <summary> 133: /// 列出tableName所有的實體信息 134: /// </summary> 135: /// <returns>執行狀態</returns> 136: public IEnumerable<member> ListAll() 137: { 138: List<member> list=new List<member>(); 139: DataTable dt=SqlHelper.ExecuteDataTable("select * from member"); 140: foreach(DataRow row in dt.Rows){ 141: list.Add(ToModel(row)); 142: } 143: return list; 144: } 145: ? 146: /// <summary> 147: ///分頁獲取數據 148: /// </summary> 149: /// <param name="tableName">表名</param> 150: /// <param name="InnerJoin">內連接</param> 151: /// <param name="strGetFields">返回的列信息</param> 152: /// <param name="sortId">排序的列名</param> 153: /// <param name="PageSize">每頁記錄數</param> 154: /// <param name="PageIndex">頁數</param> 155: /// <param name="OrderType">排序類型排序類型, 非0 值則降序</param> 156: /// <param name="strWhere">查詢條件(注意: 不要加where) </param> 157: public IEnumerable<member> ListByPagination(string tableName,string InnerJoin,string strGetFields,string sortId,int PageSize,int PageIndex,string OrderType,string strWhere) 158: { 159: List<member> list=new List<member>(); 160: DataTable dt=SqlHelper.ExecuteDataTable("exec[pagination] @tableName,@InnerJoin,@strGetFields,@sortId,@PageSize,@PageIndex,@doCount,@OrderType,@strWhere",(DbParameter)new SqlParameter("tableName",tableName),(DbParameter)new SqlParameter("@InnerJoin",InnerJoin),(DbParameter)new SqlParameter("@strGetFields",strGetFields),(DbParameter)new SqlParameter("@sortId",sortId),(DbParameter)new SqlParameter("@PageSize",PageSize),(DbParameter)new SqlParameter("@PageIndex",PageIndex),(DbParameter)new SqlParameter("@doCount","0"),(DbParameter)new SqlParameter("@OrderType",OrderType),(DbParameter)new SqlParameter("@strWhere",strWhere)); 161: foreach(DataRow row in dt.Rows){ 162: list.Add(ToModel(row)); 163: } 164: return list; 165: } 166: /// <summary> 167: ///獲取表總記錄個數(不用加where) 168: /// <param name="strWhere">查詢條件(不用加where)</param> 169: /// <summary> 170: public int GetCount(string strWhere) 171: { 172: if(!string.IsNullOrEmpty(strWhere)) 173: strWhere=" where "+strWhere; 174: return SqlHelper.ExecuteSelectFirstNum("select count(1) from member"+strWhere); 175: } 176: } 177: }這里是用代碼生成器生成的,我自己寫的一個簡單的代碼生成器,為了學習代碼生成器,專門設計了一個簡單的,
這里注意,因為代碼生成器的原因,我們必須把自己寫的方法等,通過部分類的方式合并,所以,我們都要加上partial 關鍵字,這很重要
可以看到DAL主要涉及的都是純種的增刪改查操作,他不用管具體有沒有權限之類的,這些不是
他的活,為什么要他干?
接下來就是BLL層,業務邏輯層,我們經常碰到,前期不需要功能,后期增加進去,以前沒有權限判斷,以前沒有加密要求,以前的加密太簡單,現在要更改一種更好的方法,結果要修改好多東西,這樣就全部寫在業務邏輯層,他只負責業務邏輯的判斷,然后提供給UI數據,
1: /// <summary> 2: /// 判定查詢條件 3: /// </summary> 4: /// <param name="info"></param> 5: /// <returns></returns> 6: public static string ConfirmCondition(string info) 7: { 8: string condition = "";//查詢條件 9: if (Tools.IsNumber(info)) //如果是數字,則查詢id 10: { 11: condition = "id like '%" + info + "%'"; 12: } 13: else condition = "username like '%" + info + "%'"; //查詢用戶名 14: return condition; 15: } 16: /// <summary> 17: /// 檢查用戶名和郵箱 18: /// </summary> 19: /// <param name="UserName">用戶名</param> 20: /// <param name="Email">郵箱</param> 21: /// <returns></returns> 22: public bool CheckUserNameAndEmail(string UserName,string Email) 23: { 24: memberDAL dal=new memberDAL (); 25: member info = dal.GetMemberInfo(UserName); 26: return Email==info.Email; 27: } 28: /// <summary> 29: /// 隨機生成一個6位的密碼 30: /// </summary> 31: /// <returns></returns> 32: public string CreateNewPwd() 33: { 34: string Pwd=""; 35: Random ran=new Random (DateTime.Now.Second); 36: for (int i = 0; i < 6; i++) 37: { 38: Pwd += ran.Next(1, 10); 39: } 40: return Pwd; 41: } 42: /// <summary> 43: /// 修改密碼 44: /// </summary> 45: /// <param name="UserName">用戶名</param> 46: /// <param name="Pwd">密碼</param> 47: /// <returns></returns> 48: public bool UpdatePwd(string UserName, string Pwd) 49: { 50: return new memberDAL().UpdatePassword(UserName, Tools.GetMD5(Pwd)); 51: } 52: /// <summary> 53: /// 修改密碼 54: /// </summary> 55: /// <param name="UserName">用戶名</param> 56: /// <param name="oldPwd">舊密碼</param> 57: /// <param name="newPwd">新密碼</param> 58: /// <returns></returns> 59: public bool UpdatePassword(string UserName, string oldPwd, string newPwd) 60: { 61: memberDAL dal = new memberDAL(); 62: string Pwd = dal.GetPassword(UserName); 63: if (Pwd == Tools.GetMD5(oldPwd)) 64: { 65: //加密并且更新 66: return dal.UpdatePassword(UserName, Tools.GetMD5(newPwd)); 67: } 68: return false; 69: } 70: /// <summary> 71: /// 更新member實體 72: /// </summary> 73: /// <param name="model">member實體</param> 74: /// <param name="IsUserNameUpdate">是否采用用戶名更新</param> 75: /// <returns></returns> 76: public bool UpdateUserInfo(member model) 77: { 78: return new memberDAL().Update(model, true); 79: } 80: /// <summary> 81: /// 檢驗用戶名是否存在 82: /// </summary> 83: /// <param name="userName"></param> 84: /// <returns></returns> 85: public bool CheckExistUserName(string userName) 86: { 87: return new memberDAL().GetCount(string.Format(" username='{0}'", userName)) == 0; 88: } 89: /// <summary> 90: /// 驗證用戶信息 91: /// </summary> 92: /// <param name="UserName">用戶名</param> 93: /// <param name="GuidInfo">guid隨機碼</param> 94: public bool ActivationMemberNumber(string UserName, string GuidInfo) 95: { 96: memberDAL dal = new memberDAL(); 97: //獲取過期時間 98: DateTime dt = dal.GetMemberVTime(UserName, GuidInfo); 99: //如果已經過期 100: if (dt < DateTime.Now) 101: { 102: return false; 103: } 104: else 105: { 106: //激活帳號 107: return dal.ActivationMemberStatus(UserName); 108: } 109: } 110: /// <summary> 111: /// 用戶登錄 112: /// </summary> 113: /// <param name="info">會員model</param> 114: /// <returns></returns> 115: public bool MemberLogin(member info) 116: { 117: info.password = Tools.GetMD5(info.password); 118: return new memberDAL().MemberLogin(info); 119: } 120: /// <summary> 121: /// 檢驗密碼是否正確 122: /// </summary> 123: /// <param name="UserName">用戶名</param> 124: /// <param name="Password">密碼</param> 125: /// <returns></returns> 126: public bool CheckPwd(string UserName, string Password) 127: { 128: //先不加密,以后全部都要加密 129: string Pwd = Tools.GetMD5(new memberDAL().GetPassword(UserName)); 130: if (Password == Pwd) 131: { 132: return true; 133: } 134: else 135: return false; 136: } 137: /// <summary> 138: /// 返回驗證組件的數組格式(Validate) 139: /// </summary> 140: /// <param name="fieldId">字段</param> 141: /// <param name="Status">狀態</param> 142: /// <param name="errorMsg">錯誤消息(沒有則"")</param> 143: /// <returns></returns> 144: public string ReturnValueValidateAjax(string fieldId, bool Status, string errorMsg) 145: { 146: 147: if (string.IsNullOrEmpty(errorMsg)) 148: { 149: return "[\"" + fieldId + "\",\"" + Status + "\"]"; 150: } 151: return "[\"" + fieldId + "\",\"" + Status + "\",\""+errorMsg+"\"]"; 152: 153: } 154: ? 155: /// <summary> 156: /// 返回給客戶端的json格式數據(用于根據用戶登錄狀態決定) 157: /// </summary> 158: /// <param name="info"></param> 159: /// <returns></returns> 160: public string ReturnJson(member info, out bool Status) 161: { 162: //登錄狀態 163: Status = MemberLogin(info); 164: //生成json格式數據 165: return WriteJsonForReturn(Status, info.username); 166: ? 167: } 168: /// <summary> 169: /// 記住帳號和密碼的枚舉 170: /// </summary> 171: public enum RememberType 172: { 173: /// <summary> 174: /// 記住帳號 175: /// </summary> 176: RememberName = 0, 177: /// <summary> 178: /// 同時記住帳號和密碼 179: /// </summary> 180: RememberNameAndPwd = 1, 181: /// <summary> 182: /// 不記住帳號密碼 183: /// </summary> 184: NoRemember = 2 185: } 186: ? 187: /// <summary> 188: /// 根據保存帳號密碼狀態判斷是保存帳號還是同時保存帳號和密碼 189: /// </summary> 190: /// <param name="IsSaveName">"1"代表保存,"0"代表不保存</param> 191: /// <param name="IsSavePwd">"1"代表保存,"0"代表不保存</param> 192: /// <returns></returns> 193: public RememberType GetRememberType(string IsSaveName, string IsSavePwd) 194: { 195: RememberType SaveType = RememberType.NoRemember; 196: ? 197: //保存帳號和密碼 198: if (IsSaveName.Equals("1") && IsSavePwd.Equals("1")) 199: { 200: SaveType = RememberType.RememberNameAndPwd; 201: } 202: //保存帳號 203: if (IsSaveName.Equals("1") && !IsSavePwd.Equals("1")) 204: { 205: SaveType = RememberType.RememberName; 206: } 207: else if (!IsSaveName.Equals("1")) 208: { 209: SaveType = RememberType.NoRemember; 210: } 211: return SaveType; 212: } 213: /// <summary> 214: /// 根據用戶名獲取用戶信息(返回json數據) 215: /// </summary> 216: /// <param name="UserName">用戶名</param> 217: /// <returns></returns> 218: public string GetMemberInfoByJson(string UserName) 219: { 220: bool Status = false; 221: member info = new memberDAL().GetMemberInfo(UserName); 222: if (info.Id.HasValue) 223: { 224: Status = true; 225: } 226: StringBuilder json = new StringBuilder(); 227: StringWriter sw = new StringWriter(json); 228: using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 229: { 230: jsonWriter.Formatting = Formatting.Indented; 231: jsonWriter.WriteStartObject(); 232: jsonWriter.WritePropertyName("Status"); 233: jsonWriter.WriteValue(Status); 234: jsonWriter.WritePropertyName("Data"); 235: jsonWriter.WriteStartArray(); 236: jsonWriter.WriteStartObject(); 237: jsonWriter.WritePropertyName("UserName"); 238: jsonWriter.WriteValue(info.username); 239: jsonWriter.WritePropertyName("Sex"); 240: jsonWriter.WriteValue(info.Sex); 241: jsonWriter.WritePropertyName("Nation"); 242: jsonWriter.WriteValue(info.nation); 243: //mobilephone Telephone Email qq Zipcode Address 244: jsonWriter.WritePropertyName("MobilePhone"); 245: jsonWriter.WriteValue(info.mobilephone); 246: jsonWriter.WritePropertyName("TelePhone"); 247: jsonWriter.WriteValue(info.Telephone); 248: jsonWriter.WritePropertyName("Email"); 249: jsonWriter.WriteValue(info.Email); 250: jsonWriter.WritePropertyName("QQ"); 251: jsonWriter.WriteValue(info.qq); 252: jsonWriter.WritePropertyName("ZipCode"); 253: jsonWriter.WriteValue(info.Zipcode); 254: //地址處理 255: ? 256: string[] strAddresss = GetSplitAddress(info.Address); 257: string Province = ""; 258: string City = ""; 259: string Country = ""; 260: string Address = ""; 261: if (strAddresss.Count() > 0) 262: { 263: Province = strAddresss[0]; 264: City = strAddresss[1]; 265: Country = strAddresss[2]; 266: Address = strAddresss[3]; 267: ? 268: } 269: jsonWriter.WritePropertyName("Province"); 270: jsonWriter.WriteValue(Province); 271: jsonWriter.WritePropertyName("City"); 272: jsonWriter.WriteValue(City); 273: jsonWriter.WritePropertyName("Country"); 274: jsonWriter.WriteValue(Country); 275: jsonWriter.WritePropertyName("Address"); 276: jsonWriter.WriteValue(Address); 277: jsonWriter.WriteEndObject(); 278: ? 279: jsonWriter.WriteEndArray(); 280: jsonWriter.WriteEndObject(); 281: } 282: return json.ToString(); 283: } 284: /// <summary> 285: /// 地址分割(將用戶信息表中的地址分割成 省(編號) 市(編號) 縣(編號) 家住址 286: /// </summary> 287: /// <param name="Address">地址</param> 288: /// <returns></returns> 289: public string[] GetSplitAddress(string Address) 290: { 291: string[] str = Address.Split('|'); 292: return str; 293: } 294: /// <summary> 295: /// 檢查用戶登錄狀態,用于驗證自動登錄(并返回json格式) 296: /// </summary> 297: /// <returns></returns> 298: public string CheckLoginStatus(out bool Status) 299: { 300: ? 301: //登錄狀態 302: Status = true; 303: string UserName = Common.CookieHelper.GetCookieValue("UserName"); 304: //如果cookies為空,直接返回 305: if (Tools.IsNullOrEmpty(UserName)) 306: { 307: Status = false; 308: } 309: string Pwd = Common.CookieHelper.GetCookieValue("Pwd"); 310: if (Tools.IsNullOrEmpty(Pwd)) 311: { 312: Status = false; 313: } 314: else 315: { 316: //查找該用戶真實密碼,并進行md5加密 317: string password = new memberDAL().GetPassword(UserName); 318: //如果兩次密碼相同則可以自動登陸了 319: if (password!=Pwd) 320: { 321: Status = false; 322: } 323: } 324: ? 325: //生成json格式數據 326: return WriteJsonForReturn(Status, UserName); 327: } 328: /// <summary> 329: /// 為用戶登錄寫入json數據 330: /// </summary> 331: /// <param name="Status">登錄狀態</param> 332: /// <param name="UserName">用戶名</param> 333: /// <returns></returns> 334: public string WriteJsonForReturn(bool Status, string UserName) 335: { 336: StringBuilder json = new StringBuilder(); 337: StringWriter sw = new StringWriter(json); 338: using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 339: { 340: jsonWriter.Formatting = Formatting.Indented; 341: jsonWriter.WriteStartObject(); 342: jsonWriter.WritePropertyName("Status"); 343: jsonWriter.WriteValue(Status); 344: jsonWriter.WritePropertyName("UserName"); 345: jsonWriter.WriteValue(UserName); 346: jsonWriter.WriteEndObject(); 347: } 348: return json.ToString(); 349: } 350: /// <summary> 351: /// 記住用戶信息 352: /// </summary> 353: /// <param name="Type">記住用戶信息類別</param> 354: /// <returns></returns> 355: public bool RememberUserInfo(member info, RememberType type) 356: { 357: if (type == RememberType.RememberName) 358: { 359: //記住帳號7天 360: CookieHelper.SetCookie("UserName", info.username, DateTime.Now.AddDays(7)); 361: } 362: else if (type == RememberType.RememberNameAndPwd) 363: { 364: ? 365: //md5哈希加密 366: string sercret = Tools.GetMD5(info.password); 367: //同時記住帳號和密碼7天 368: CookieHelper.SetCookie("UserName", info.username, DateTime.Now.AddDays(7)); 369: CookieHelper.SetCookie("Pwd", sercret, DateTime.Now.AddDays(7)); 370: } 371: else 372: { 373: return false; 374: } 375: return true; 376: ? 377: } 378: ? 379: ? 380: } 381: }?
可以看到,這里沒有任何數據庫的操作,他只負責業務邏輯判斷,然后給UI提供數據.
而web的UI層,我們以前經常性碰到這樣的代碼,
1: /// <summary> 2: /// 網頁中間顯示的涵數condiction顯示條件,nums顯示行數 3: /// </summary> 4: /// <param name="condiction"></param> 5: /// <param name="nums"></param> 6: public void Show(string condiction, int nums) 7: { 8: ? 9: string sql = ""; 10: //還要修改 11: string id = ""; 12: string picturepath = ""; 13: string name = ""; 14: string appreciation = ""; 15: string reward = ""; 16: string title = ""; 17: string time = ""; 18: string ArticleHtmlUrl = ""; 19: StringBuilder content = new StringBuilder();//高效率拼接字符串 20: if (condiction == "大師風采") 21: { 22: sql = "select top " + nums + " hit,id,name,appreciation,Reward,Picturepath from master where state='1' and state1='1' order by master.rank desc"; 23: DataTable dt = cs.GetDataSet(sql).Tables[0]; 24: ? 25: ? 26: for (int i = 0; i < dt.Rows.Count; i++) 27: { 28: id = dt.Rows[i]["id"].ToString(); 29: picturepath = dt.Rows[i]["Picturepath"].ToString(); 30: picturepath = GetPicturePath(picturepath); 31: name = dt.Rows[i]["name"].ToString(); 32: ? 33: //appreciation = GetTile(dt.Rows[i]["appreciation"].ToString().Replace("<br>","\r\n")); 34: //reward = GetTile(dt.Rows[i]["Reward"].ToString().Replace("<br>", "\r\n")); 35: if (i == 0) { 36: content.Append("<div class='r_s_p m_border'>"); 37: } 38: else 39: { 40: content.Append("<div class='r_s_p'>"); 41: } 42: content.Append("<div class='gk_pic'><img src='" + picturepath + "' alt='" + dt.Rows[i]["name"].ToString() + "'/></div>"); 43: ? 44: content.Append("<div class='master_p'>"); 45: ? 46: content.Append("<p><strong><a href='Masterintro.aspx?id=" + id + "'>" + name + "</a></strong></p>"); 47: ? 48: content.Append("<div class='honor'><ul>"); 49: ? 50: content.Append("<li><a href='Masterintro.aspx?id=" + id + "'>" + appreciation + "</a></li>"); 51: ? 52: content.Append("<li><a href='Masterintro.aspx?id=" + id + "'>" + reward + "</a></li>"); 53: content.Append("</ul></div></div></div>"); 54: ? 55: content.Append("<div class='master_border'> </div>"); 56: ? 57: } 58: ? 59: Response.Write(content.ToString()); 60: return; 61: ? 62: } 63: ? 64: ? 65: ? 66: ? 67: if (condiction == "業內新聞") 68: { 69: sql = "select top " + nums + " id,title,time,ArticleHtmlUrl from news order by time desc"; 70: DataTable dt = cs.GetDataSet(sql).Tables[0]; 71: //if (dt.Rows.Count == 0) 72: //{ 73: // content.Append("<li><a href='#'>#</a><span class='time'>[##-##-##]</span></li>"); 74: //} 75: for (int i = 0; i < dt.Rows.Count; i++) 76: { 77: ? 78: title = GetTile(dt.Rows[i]["title"].ToString()); 79: ? 80: id = dt.Rows[i]["id"].ToString(); 81: ? 82: time = ((DateTime)dt.Rows[i]["time"]).Date.ToShortDateString(); 83: ? 84: ArticleHtmlUrl = dt.Rows[i]["ArticleHtmlUrl"].ToString(); 85: ? 86: content.Append("<li><a href='NewsContent.aspx?id="+id+"'>" + title + "</a><span class='time'>[" + time + "]</span></li>"); 87: ? 88: } 89: Response.Write(content.ToString()); 90: ? 91: return; 92: ? 93: } 94: if (condiction == "工藝知識") 95: { 96: ? 97: sql = "select top " + nums + " id,title,time,ArticleHtmlUrl from craftknowledge order by time desc"; 98: ? 99: DataTable dt = cs.GetDataSet(sql).Tables[0]; 100: ? 101: //if (dt.Rows.Count == 0) 102: //{ 103: // content.Append("<li><a href='#'>#</a><span class='time'>[##-##-##]</span></li>"); 104: //} 105: for (int i = 0; i < dt.Rows.Count; i++) 106: { 107: ? 108: title = GetTile(dt.Rows[i]["title"].ToString()); 109: ? 110: id = dt.Rows[i]["id"].ToString(); 111: ? 112: time = ((DateTime)dt.Rows[i]["time"]).Date.ToShortDateString(); 113: ? 114: ArticleHtmlUrl = dt.Rows[i]["ArticleHtmlUrl"].ToString(); 115: ? 116: //Response.Write("<li><a href='craftknowledge_info.aspx?craft_id=" + id + "'>" + title + "</a><span class='time'>[" + time + "]</span></li>"); 117: ? 118: content.Append("<li><a href='craftknowledge_info.aspx?id=" + id + "'>" + title + "</a><span class='time'>[" + time + "]</span></li>"); 119: ? 120: } 121: Response.Write(content.ToString()); 122: return; 123: ? 124: } 125: ? 126: if (condiction == "企業展示") 127: { 128: sql = "select top " + nums + " hit, id,name from company where state='1' and state1='1' order by company.rank desc"; 129: ? 130: DataTable dt = cs.GetDataSet(sql).Tables[0]; 131: //if (dt.Rows.Count == 0) 132: //{ 133: // content.Append("<li><a href='#'>#</a></li>"); 134: //} 135: for (int i = 0; i < dt.Rows.Count; i++) 136: { 137: id = dt.Rows[i]["id"].ToString(); 138: ? 139: name = GetTile(dt.Rows[i]["name"].ToString()); 140: ? 141: ? 142: ? 143: content.Append("<li><a href='company_introduce.aspx?id=" + id + "'>" + name + "</a></li>"); 144: ? 145: } 146: Response.Write(content.ToString()); 147: return; 148: ? 149: } 150: }這種UI和數據混合的方式,如果界面一修改,改動大了,經常性碰到,這個界面太囧了......然后改整個版面,為什么我們不把數據和UI隔離開來,后臺么?
只負責數據提供,通過JSON等傳輸,然后前臺js/JQuery操作界面呢?
這樣前臺就應該這樣,
1: <%@ Page Language="C#" MasterPageFile="~/InfoPage.master" AutoEventWireup="true" 2: CodeFile="MasterInfo.aspx.cs" Inherits="Master_MasterInfo" Title="大師信息" %> 3: ? 4: <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> 5: <link href="../css/gs_ms.css" rel="stylesheet" type="text/css" /> 6: ? 7: <script src="../Admin/scripts/jquery-1.7.1.min.js" type="text/javascript"></script> 8: ? 9: <script src="../js/queryUrlParams.js" type="text/javascript"></script> 10: ? 11: <script src="MasterInfo.js" type="text/javascript"></script> 12: ? 13: 14: <script type="text/javascript"> 15: //獲得大師id信息 16: var id=$.query.get("MasterId"); 17: </script> 18: ? 19: </asp:Content> 20: <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 21: <div class="ms"> 22: <div class="ms_top"> 23: <div class="m_load"> 24: <span><a href="../Default.aspx">首頁</a> > <a href="MasterList.aspx">大師風采</a> > 大師</span></div> 25: <div class="mst_c"> 26: <ul class="mst_ul"> 27: <li><a href="#" id="Master_Intro"> 28: <p class="hide"> 29: 大師簡介</p> 30: </a></li> 31: <li><a href="#" id="Master_Award"> 32: <p class="hide"> 33: 獲獎情況</p> 34: </a></li> 35: <li><a href="#" id="Master_Work"> 36: <p class="hide"> 37: 大師作品</p> 38: </a></li> 39: </ul> 40: <div class="mst_img"> 41: <img src="../images/master_img.png" id="imgMaster" /></div> 42: <div class="mst_xx"> 43: <table width="252" height="141" id="tbMasterInfo"> 44: </table> 45: </div> 46: </div> 47: </div> 48: <div class="gs_nr" id="MasterContent"> 49: 50: </div> 51: </div> 52: </asp:Content>然后通過jquery操作,
1: 2: $(function(){ 3: GetMasterInfo(); 4: GetMasterIntro(); 5: //綁定獲取大師簡介事件 6: $("#Master_Intro").click(function(){ 7: GetMasterIntro(); 8: }); 9: $("#Master_Award").click(function(){ 10: GetMasterReward(); 11: }); 12: $("#Master_Work").click(function(){ 13: GetMasterWork(); 14: }); 15: }); 16: //獲取大師基本信息 17: function GetMasterInfo(){ 18: $.ajax({ 19: url:"Data/MasterInfo.ashx?method=GetMasterInfo&MasterId="+id, 20: type:"post", 21: success:function(text){ 22: var jsonData=$.parseJSON(text); 23: if(jsonData.Status){ 24: var item='<tr><td width="51"> 姓名:</td>'; 25: item+=' <td width="92">'+jsonData.Data[0].Name+'</td>'; 26: item+='<td width="47">性別: </td>'; 27: item+='<td width="42">'+jsonData.Data[0].Sex+'</td>'; 28: item+=' </tr>'; 29: item+='<tr> <td> 出生:</td>'; 30: item+='<td>'+jsonData.Data[0].Birthday+'</td>'; 31: item+='</tr>'; 32: item+=' <tr><td colspan="4">藝術家分類:'; 33: item+=jsonData.Data[0].TypeName; 34: item+='</td></tr>'; 35: 36: $("#tbMasterInfo").empty(); 37: $("#tbMasterInfo").append(item); 38: var src="../Admin/FileManage/GetImg.ashx?method=GetMasterPic&type=medium&fileName="+jsonData.Data[0].PicturePath; 39: $("#imgMaster").attr("src",src); 40: } 41: } 42: }); 43: 44: } 45: //獲取大師簡介信息 46: function GetMasterIntro(){ 47: $.ajax({ 48: url:"Data/MasterInfo.ashx?method=GetMasterIntro&MasterId="+id, 49: type:"post", 50: success:function(text){ 51: var jsonData=$.parseJSON(text); 52: if(jsonData.Status){ 53: var item='<h4>大師簡介</h4>'; 54: item+='<p>'+jsonData.Data[0].Introduction+'</p>'; 55: $("#MasterContent").empty(); 56: $("#MasterContent").append(item); 57: } 58: } 59: }); 60: } 61: //獲取大師榮譽信息 62: function GetMasterReward(){ 63: $.ajax({ 64: url:"Data/MasterInfo.ashx?method=GetMasterReward&MasterId="+id, 65: type:"post", 66: success:function(text){ 67: var jsonData=$.parseJSON(text); 68: var item='<h4>大師榮譽</h4>'; 69: if(jsonData.Status){ 70: item+='<ul class="gs_reward">'; 71: item+=' <li>'+jsonData.Data[0].Reward+'</li></ul>'; 72: item+=' <h4>獲獎情況</h4><ul class="gs_cup">'; 73: $.each(jsonData.Data[0].CertPicList,function(key,value){ 74: var img="../Admin/FileManage/GetImg.ashx?method=GetMasterCert&type=medium&fileName="+value.CertPic; 75: item+='<li><span class="c_pic_a">'; 76: item+='<img src='+img+' alt='+value.CertName+' title='+value.CertName+'/></span><span class="a_title">'+value.CertName+'</span>'; 77: item+='</li>'; 78: }); 79: item+='</ul>'; 80: 81: } 82: else{ 83: item+=' <h4>獲獎情況</h4>'; 84: } 85: $("#MasterContent").empty(); 86: $("#MasterContent").append(item); 87: } 88: }); 89: } 90: //獲取大師產品信息 91: function GetMasterWork(){ 92: $.ajax({ 93: url:"Data/MasterInfo.ashx?method=GetMasterWork&MasterId="+id, 94: type:"post", 95: success:function(text){ 96: var jsonData=$.parseJSON(text); 97: var item=''; 98: if(jsonData.Status){ 99: $.each(jsonData.Data,function(key,value){ 100: item+='<h4>'+value.TypeName+'</h4>'; 101: item+='<ul class="gs_pic">'; 102: $.each(value.Product,function(PKey,PValue){ 103: var img="../Admin/FileManage/GetImg.ashx?method=GetMainProductPic&type=medium&fileName="+PValue.Picturepath; 104: item+='<li>'; 105: item+='<a href="../Product/Product.aspx?ProductId='+PValue.ProductId+'" class="c_pic_a"><img src="'+img+'" alt="'+PValue.Name+'" title="'+PValue.SimpleName+'"/></a>'; 106: item+='<a href="../Product/Product.aspx?ProductId='+PValue.ProductId+'" class="a_title">'+PValue.SimpleName+'<br/><span class="rad2">¥'+PValue.Lsprice+'</span></a> '; 107: item+='</li>'; 108: }) 109: item+='</ul>'; 110: item+='<div style="text-align:right"><a href="../Product/Master_MoreProduct.aspx?MasterId=' + id + '&&TypeId=' + value.TypeId + '">more>></a></div>'; 111: 112: }) 113: 114: } 115: else{ 116: item+='沒有數據!'; 117: } 118: $("#MasterContent").empty(); 119: $("#MasterContent").append(item); 120: } 121: }); 122: } 123:這樣不管怎么改界面,我們的數據是不變的,哈哈!
?
還有最最最重要的,我們的代碼規范,命名規范,我的所有代碼全部自己強制性要求自己必須遵
守,所以才能一目了然,清晰,嚴謹,易于維護和開發!
今天的三層就總結到這里!
還有項目中比較重要的一些東西,下次在總結!
轉載于:https://www.cnblogs.com/mysweet/archive/2012/05/07/2486771.html
總結
以上是生活随笔為你收集整理的一步一步asp.net_三层构架的学习的全部內容,希望文章能夠幫你解決所遇到的問題。