1. 程式人生 > >利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理

利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理

serve 取數 sele oid 數據庫操作 comm 評論 data http

利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理

2018-3-10 15:18 | 發布:Admin | 分類:代碼庫 | 評論:0 | 瀏覽:45 |

該類在MVC中可以方便管理配置信息,可以直接把Model儲存進數據庫或者從數據庫去除數據轉為Model.

1 何為配置項目?

比如網站的名稱,頁腳信息,meta中的KeyWord信息等,如果不想硬編碼到網頁裏,就需要使用配置文件進行儲存,通常都是儲存到數據庫中.使用的時候讀取出來,也方便修改.

2 MVC中對於數據的編輯一般是Model建模,然後View調用強類型,使用諸如@Html.TextBoxFor(m=>m.Name)之類的方式,取值時可以直接取到Model,不用再根據Request.From來一個一個的去賦值.

3 MVC的特性提供了強大的數據自檢能力,如果Model中屬性為Int類型,那麽輸入的時候如果不是數字則會直接提示類型錯誤.該特性支持正則表達式,可以說不用寫一句js代碼就可以完成數據的服務器端和客戶端雙重驗證,十分強大.

4 本類只有兩個方法,一個Load 一個Save,顧名思義,一個讀取一個儲存.參數都采用了泛型.你可以創建一個ConfigWebSIteModel基本設置類,

然後再創建一個ConfigSeo類,來分別管理不同的配置項目,可以一並儲存到一個數據表中.

1 2 T Load<T>(); void Save<T>(T t);

不用的類中的屬性不可以重復,否則會覆蓋,比如ConfigWebSiteModel中有個ConfigWebSiteModel.Name 那麽 ConfigSeo中就不能在出現Name屬性,否則會覆蓋掉,出錯.

核心代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Text; using ChengChenXu.Blog.Models; using System.Reflection; using System.Data.SqlClient; namespace ChengChenXu.Blog.DAL.SqlServer { public class ConfigModelDAL:IConfigModelDAL { private readonly string tableName = "blog_Config";//表名 private readonly string columnKey = "c_Key";//key列名 private readonly string columnValue = "c_Value";//Value列名 private readonly string columnType = "c_Type";//Type列名 /// <summary> /// 加載 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public T Load<T>() { //通過sqlhelper獲取datatable string sql = "select * from " + tableName; DataTable dt = SqlHelper.ExecuteDataTable(sql); //不存在記錄 if (dt.Rows.Count == 0) return default(T); //表行轉換成列 ,臨時表 DataTable temp = new DataTable(); foreach (DataRow dr in dt.Rows) { //添加一列,設置列的數據類型 DataColumn dc = new DataColumn(); dc.ColumnName = dr[columnKey].ToString(); //根據字符串設置數據類型 dc.DataType = System.Type.GetType(dr[columnType].ToString()); temp.Columns.Add(dc); //如果時第一列,添加一行 int index = temp.Columns.Count - 1; if (temp.Rows.Count == 0) temp.Rows.Add(); //如果不是第一例,則行必定已經存在,直接賦值 temp.Rows[0][index] = dr[columnValue]; } if (temp.Columns.Count == 0) return default(T); //把臨時表轉換成Model並返回 return temp.Rows[0].ToModel<T>(); } /// <summary> /// 保存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> public void Save<T>(T t) { //利用反射獲取對象所有屬性 string attributeName = String.Empty; PropertyInfo[] propertys = t.GetType().GetProperties(); //獲取數據庫配置表放到內存中,對比數據是否已經存在 DataTable dt = new DataTable(); if (propertys.Length > 0) { dt = SqlHelper.ExecuteDataTable("select * from "+tableName+""); //給表設置主鍵,方便查找. dt.PrimaryKey=new[] {(dt.Columns[columnKey])}; } //依次保存對象屬性到數據庫 foreach (PropertyInfo pi in propertys) { //獲取屬性值 var a = pi.GetValue(t, null); //值為NULL跳出,不保存,進入下個循環 if (a == null) { SqlHelper.ExecuteNonQuery("delete from "+tableName+" where "+columnKey+" =‘"+pi.Name+"‘ "); continue; } //準備sql參數 SqlParameter[] parameters = SqlHelper.CreatParameters( new string[] { "Key", "Value" ,"Type"}, new object[] { pi.Name, a, a.GetType().ToString() } ); //查找屬性是否已經存在於數據庫中 if(dt.Rows.Contains(pi.Name)) { //存在 更新屬性 SqlHelper.ExecuteNonQuery( "update " + tableName + " set " + columnValue + " = @Value , " + columnType + " = @Type where " + columnKey + " = @Key", parameters ); } else { //不存在 插入屬性 SqlHelper.ExecuteNonQuery( "insert into " + tableName + " (" + columnKey + "," + columnValue + "," + columnType + ") values (@key,@value,@type) ", parameters ); } } } } }

該類用到了兩個外部類,一個是SqlHelper 就是普通的數據庫輔助類,只用到了根據Sql語句和參數進行查詢,更新,插入的功能,可以替換為自己的Helper類或者直接在此類中完成數據庫操作

另外一個是把DataRow轉換為Model對象的類,這個類是一個擴展方法,引用之後就可以直接對DataRows實例進行ToModel操作了.

1 return temp.Rows[0].ToModel<T>();

Sqlhelper類不再貼出,可以自己查找.擴展方法見本文:http://www.chengchenxu.com/Article/10/

本博客源碼中也使用了此類,可以關註後期整理好源碼後會開源,可以參考用法.

使用方法很簡單:

1 這四個屬性對應數據庫中的表名以及列名,可以自定義,例如下圖這樣.

1 2 3 4 private readonly string tableName = "blog_Config";//表名 private readonly string columnKey = "c_Key";//key列名 private readonly string columnValue = "c_Value";//Value列名 private readonly string columnType = "c_Type";//Type列名

技術分享圖片

key要設置為主鍵,類型都為varchar,長度視情況而定.

2 數據庫鏈接字符串都是sqlHelper類中定義,SqlHelper類參考文章:http://www.chengchenxu.com/Article/11/sqlhelper

3 創建一個Model

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class ConfigSeoModel { [Display(Name = "Meta關鍵字")] public string KeyWord { get; set; } [Display(Name = "Meta描述")] public string Description { get; set; } } // ConfigModelDAL dal=new ConfigModelDAL(); //new 一個Model ConfigSeoModel model=new ConfigSeoModel(); model.KeyWord="關鍵字"; model.Description = "描述" //完成保存 dal.Save<ConfigSeoModel>(model); //讀取 ConfigSeoModel model = dal.Load<ConfigModel>();

本文為博主原創,轉載請保留出處:
http://www.chengchenxu.com/Article/24/fanxing

Tags: Model MVC 泛型 ?? 上一篇下一篇 ??

相關文章:

C.Net串口工具源碼 串口調試工具 支持16進制發送 可以定時自動發送

利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理

asp.net MVC通用分頁組件 使用方便 通用性強

.NET C#生成隨機顏色,可以控制亮度,生成暗色或者亮色 基於YUV模式判斷顏色明亮度

微軟官方SqlHelper類以及輔助訪問類 簡化使用方法

DataTable和DataRow利用反射直接轉換為Model對象的擴展方法類

利用反射和泛型把Model對象按行儲存進數據庫以及按行取出然後轉換成Model 類實例 MVC網站通用配置項管理