--- tags: 國興實習 --- # 後端Controller(基本) :::info **⚠️下拉命名:QL=查詢之下拉、DL=編輯or新增之下拉** ::: ### 初始方法 ```C#= [System.Web.Http.HttpGet] public IHttpActionResult Init() { Searching += l_Master_Searching; //搜尋事件 Initialing += l_Master_Initialing; //加入下拉元件 return doInitResult(); } ``` ### 新增、刪除、編輯方法 ```C#= [System.Web.Http.HttpPost] public IHttpActionResult Insert(DeltaMD a_dr) { this.Posting += l_Master_Posting; //存檔前事件 RefreshMasterData += l_Master_RefreshMasterData; return doPostResult(enStatus.Insert, a_dr); } [System.Web.Http.HttpPost] public IHttpActionResult Delete(DeltaMD a_dr) { return doPostResult(enStatus.Delete, a_dr); } [System.Web.Http.HttpPost] public IHttpActionResult Edit(DeltaMD a_dr) { RefreshMasterData += l_Master_RefreshMasterData; return doPostResult(enStatus.Edit, a_dr); } ``` ### 後端getMaster→SQL語法連結 ```C#= public override MasterClass getMaster() { //SQL必須加入1=1條件,以便if判斷式參數取代 StringBuilder l_SQL = new StringBuilder(); l_SQL.Append(@" Select M.* From FNAPRJNEO M Where 1=1 order by m.APRJNEO_ID_NEO "); //前端Grid顯示依據 return new MasterClass() { tableName = "FNAPRJNEO", isNoDataFirstLoad = false, //程式第一次載入時是否有資料 sQL = l_SQL.ToString().ToUpper(), keyField = new string[1] { "APRJNEO_ID_NEO" }, notNullField = new string[2] { "APRJNEO_NM_NEO", "APRJNEO_RM" },//不可空白欄位 noEditButInsertField = new string[0] { },//不可編輯,但可新增欄位 noEditField = new string[1] { "APRJNEO_ID_NEO" }, //不可編輯欄位 searchData = new SearchClass() { APRJNEO_NM_NEO = "", APRJNEO_RM = "" }//查詢條件預設值 }; } ``` ### SearchClass變數宣告 ```C#= public class SearchClass : ISearchClass { public string TYPE_DEPT { get; set; } //定義變數及設定取值與賦值之保護層級 public string TYPE_NO { get; set; } public string TYPE_NM { get; set; } } ``` ### 搜尋方法 ```C#= [System.Web.Http.HttpPost] public IHttpActionResult Search(SearchClass a_Search) { Searching += l_Master_Searching; this.Initialing += l_Master_Initialing; //加入下拉元件 return doSearchResult(a_Search); } void l_Master_Searching(object sender, SearchingEventArgs e) { SearchClass l_Search = (SearchClass)e.SearchData; string l_SQL = ""; if (!string.IsNullOrEmpty(l_Search.TYPE_DEPT)) { l_SQL = l_SQL + " AND (IsNull(M.TYPE_DEPT,'') = @TYPE_DEPT )"; e.ht.Add("@TYPE_DEPT", new StructureSQLParameter(l_Search.TYPE_DEPT, SqlDbType.NVarChar)); } if (!string.IsNullOrEmpty(l_Search.TYPE_NO)) { l_SQL = l_SQL + " AND (IsNull(M.TYPE_NO,'') = @TYPE_NO )"; e.ht.Add("@TYPE_NO", new StructureSQLParameter(l_Search.TYPE_NO, SqlDbType.NVarChar)); } if (!string.IsNullOrEmpty(l_Search.TYPE_NM)) { l_SQL = l_SQL + " AND (IsNull(M.TYPE_NM,'') like '%' + @TYPE_NM + '%' )"; e.ht.Add("@TYPE_NM", new StructureSQLParameter(l_Search.TYPE_NM, SqlDbType.NVarChar)); } e.MasterSQL = e.MasterSQL.Replace("1=1", "1=1 " + l_SQL); } ``` ### 刷新資料方法 當資料有所變動時要刷新,所以才會在新增、編輯呼叫到 ```C#= #region l_Master_RefreshMasterData方法 void l_Master_RefreshMasterData(object sender, RefreshMasterDataEventArgs e) //刷新主鍵 { string l_SQL = @" AND TYPE_NO = @TYPE_NO "; e.ht.Add("@TYPE_NO", new StructureSQLParameter(e.newRow["TYPE_NO"].ToString(), SqlDbType.NVarChar)); e.MasterSQL = e.MasterSQL.Replace("1=1", "1=1 " + l_SQL); } ``` :::info **⚠️若在getMaster()中的Append有join多個表,記得加上資料庫別名來參照該表主鍵** ::: ### 存檔前事件-以流水號為例 ```C#= void l_Master_Posting(object sender, CancelMsgEventArgs e){ //e.newRow["TYPE_NO"] = ShareModel.GET_SEQ(e.newRow["TYPE_DEPT"].ToString()); //引用Model建立流水號 } ``` ```C#= public IHttpActionResult Insert(DeltaMD a_dr) { this.Posting += l_Master_Posting; //按下新增鈕且在存檔之前 RefreshMasterData += l_Master_RefreshMasterData; return doPostResult(enStatus.Insert, a_dr); } ``` :::info **newRow[] = 前端沒有的欄位。Ex:在SQL建立流水號(如新增、編輯)** **oldRow[] = 前端有的值。Ex:下拉選單連動** :::