標籤:報表 表單 asp.net jquery .net快速開發
連載:(二)循序漸進,通過XML配置,實現通用於WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表單、報表--原理
長江支流
本原理,適用於Window Form的CS,也適用於ASP.Net的BS。
在描述原理之前,先來看個傳統的ORM寫代碼的例子。
實體映射
現在很多架構實現ORM,去動態產生代碼,實現資料增、刪、改、查的功能。
實體的映射關係,是通過代碼的方式進行映射的,是否可以通過XML檔案,來配置執行個體的映射關係,答案是肯定的。
代碼映射這裡,先看一下主鍵為ID的表test_EntityAccessORM有兩個欄位DM、MC表示代碼、名稱,表欄位與實體的映射代碼實現方式。
(注意:寫代碼不是我們本意,我們將要拋棄代碼,程式員就是為了不寫代碼或少寫代碼!)
using System;using WebMIS.Data.EntityAccess;using WebMIS.Data.EntityAccess.MapAttribute;namespace WebMIS.Data.EntityAccess.Test{/// <summary>/// 實體映射。/// </summary> //描述映射的表名,主鍵(主鍵可多個),如("myTable","ID,NO")或("myTable","ID","NO"),可寫在類申明上,也可寫在無參公有建構函式上,且類上優先。[WebMIS.Data.EntityAccess.MapAttribute.TableMap("test_EntityAccessORM","ID")] public class EntityMapByAuto:WebMIS.Data.EntityAccess.EntityAutoMap{private long _ID;//IDprivate string _Code ;//代碼private string _Name ;//名稱//[WebMIS.Data.EntityAccess.MapAttribute.TableMap("test_EntityAccessORM","ID")] public EntityMapByAuto(){}[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap("ID",System.Data.DbType.UInt32)]public long ID{get{return _ID;}set{_ID = value;}}[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap("dm")]public string Code{get{return _Code;}set{_Code = value;}}[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap("mc")]public string Name{get{return _Name;}set{_Name = value;}}//以下公有欄位或屬性,沒有ColumnMap ,不參預ORMpublic string abc="";public static string ABCD{get{return "ABCD1";}}}}
由此可知,通過屬性類WebMIS.Data.EntityAccess.MapAttribute.TableMap指定表及主鍵,通過WebMIS.Data.EntityAccess.MapAttribute.ColumnMap指定資料庫表欄位與屬性的對應映射關係。大家從VS內建的Entity FrameworkEF中也可以找出類似的實現原理。
XML映射我們這裡要實現的,是通過XML設定檔,配置表欄位與實體的映射關係,不寫代碼的實現方式。這樣的好處時,只需要改設定檔,無需編譯再發布部署程式,靈活方便。
這裡,特別要注意的是,XML<Field>節點中<lD>表示WinForm/WebForm中控制項的ID屬性或標準html元素的name屬性,<Name>表示Select中指定的欄位名。
而且還要注意:<Field>定義,<lD>要與UI中控制項或元素ID/Name屬性相同(區分大小寫)、<Name>是<Select>元素中寫出的欄位,區分大小寫。
<?xml version="1.0" encoding="utf-8"?><WebMisControllerSerializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Controller> <!--注意,Select中的欄位大小寫,所以Field中的Name節點,要與之一樣--> <Select>Select ID, DM,MC From test_EntityAccessORM</Select> <TableName>test_EntityAccessORM</TableName> <PrimaryKey>ID</PrimaryKey> <PrimaryKeyValue /> <UpdateWhere /> <DeleteWhere /> <Fields> <Field> <!--ID節點表示WinForm/WebForm中控制項的ID屬性或標準html元素的name屬性--> <ID>ID</ID> <!--Name節點表示Select中指定的欄位名--> <Name>ID</Name> <Type /> <Save>false</Save> <Visible>false</Visible> </Field> <Field> <ID>Code</ID> <Name>DM</Name> <Align>right</Align> <Width>30</Width> <Type /> <Save>true</Save> <Title>代碼</Title> <FormType /> <Visible>true</Visible> <Null>false</Null> <NullTitle>代碼不可為空,請輸入!</NullTitle> <Sql /> <Value /> <Excel /> <UserInputValue /> </Field> <Field> <ID>Name</ID> <Name>MC</Name> <Title>名稱</Title> <NullTitle>名稱不可為空,請輸入!</NullTitle> </Field> </Fields> </Controller></WebMisControllerSerializer>
運行原理
假設,在網格的某一行選擇後點擊編輯按鈕或雙擊網格某一行,彈出一個顯示編輯的UI介面(WinForm或Web網頁,由使用者或UI設計師開發)。解析程式,會根據XML設定檔中的Select節點擷取資料來源,通過傳遞的主鍵值擷取唯一記錄,並將記錄值根據XML配置的欄位對應關係以及與UI中的映射關係,將讀取的資料顯示在UI中。
如果儲存資料,首先判斷設定的Null為false時表示不允許為空白,根據NullTitle提示使用者輸入;然後判斷如果設定了存在性檢查,就會去執行指定的檢查規則…;最後,擷取欄位值以存入資料庫。值一般是通過UI元素控制項輸入,或可以從Excel單元格擷取,也可以通過SQL擷取,並且優先通過程式配置UserInputValue的鍵值對設定。
除此之外,系統還會根據一定規則,去讀參數值,例如Asp.Net時取URL參數指定值、Session、Application值。
通過XML描述的控制檔案叫控制檔案,它可以描述模型定義、UI表單、互動回呼函數、查詢報表資料來源、查詢過濾條件欄位等。
使用者自己定義UI介面的頁面模板,叫做模板檔案,用於輸入或顯示XML中指定資料來源的資料。當然,如果不指定模板檔案,可以根據XML控制檔案,自動產生頁面。
通過XML描述的控制檔案,由解析程式來處理並控制的,它會根據控制檔案的模型描述,將資料庫中資料顯示在UI視圖中或者將表單資料存放區到資料庫中。
在本串連下一章節,將用C#實現XML設定檔相關類,並給出原始碼。
聲明:本文著作權為長江支流周方勇所有,如需轉載,請保留完整的內容及出處。
長江支流 [email protected] :winxin8001234567
連載:(二)循序漸進,通過XML配置,實現通用於WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表單、報表--原理