從零開始編寫本身的C#框架(21)——添加分類類型頁面

頁面權限與頁面控件權限通過簡單的調試後,終於啓用起來了,之後你們添加新頁面時,就必須按照本章介紹的方法,將你新增的頁面註冊到系統中,這樣才能訪問與進行相關操做。sql

  下面講講如何建立一個分類類型的頁面。數據庫

  分類類型,顧名思義指的是按照必定規律、特色進行歸類劃分,放到一塊的集合。咱們開發時這些分類類型,常常用下拉列表來表現,若是有多級分類時,採用的是下拉樹列表方式顯示。後端

  普通下拉列表數組

  

  下拉樹列表緩存

  

 

  下面將介紹如何從建立數據表、修改文件到權限綁定逐個步驟進行說明。安全

  

  首先,咱們先要建立好數據表服務器

  咱們打開數據字典,按數據字典中的格式,建立一個廣告位置管理表併發

  而後打開大神July提供的SQL語句生成工具,生成數據表建立語句框架

  運行ExcelToSQLString2.91_sql.exe,選擇《數據字典》的文件路徑,設置想要生成SQL語句的表格名稱,而後點擊運行ide

  生成下面語句

  將生成的語句放到SQL的查詢分析器中執行,生成數據表(見下圖已生成的數據表)

  打開解決方案,找到數據層的SubSonic文件夾,按下圖進行選擇後,點擊右鍵,找到「運行自定義工具」,點擊從新運行生成數據層模板類

  找到邏輯層的SubSonic文件夾,按下圖進行選擇後,點擊右鍵,找到「運行自定義工具」,點擊從新運行生成邏輯層模板類

 

  經過以上操做,已經幫咱們生成了底層咱們須要調用到的經常使用實體和函數了,下面接着建立相關文件

 

  爲了方便管理,咱們在UI層後端管理文件夾(WebManage)中建立一個AdvertisingPositions文件夾,用於存放廣告管理的相關文件

  已建立好文件夾

  打開Informations文件夾,將InformationClassList.aspx複製到AdvertisingPositions文件夾中(由於這兩個文件的功能比較類似,因此直接複製過來修改)

  將InformationClassList.aspx更名爲AdvertisingPositionList.aspx

  打開AdvertisingPositionList.aspx與AdvertisingPositionList.aspx.cs文件,按下面方式進行替換

  將頁面中的「InformationClass」替換成「AdvertisingPosition」

  將頁面中的「信息分類」替換爲「廣告位置」

  找到AdvertisingPositionList.aspx.cs文件的命名空間,將Informations替換成AdvertisingPositions,以下圖

  一樣找到AdvertisingPositionList.aspx文件也進行同面的替換

  通過替換,頁面大致的功能就完成了。

 

  打開AdvertisingPositionList.aspx文件,將Grid中想要顯示的列從新進行設置綁定(按下面內容進行修改,具體怎麼使用FineUI,你們能夠登錄FineUI官網查看在線示例,或者先按我代碼中的內容嘗試對控件屬性進行增改操做後刷新頁面,查看修改後的效果,弄上幾個就很容易明白怎麼使用了)

 1             <f:Grid ID="Grid1" Title="廣告位置列表" EnableFrame="false" EnableCollapse="true" AllowSorting="true"  2 PageSize="15" ShowBorder="true" ShowHeader="False" AllowPaging="true" runat="server" EnableCheckBoxSelect="True" DataKeyNames="Id" EnableColumnLines="true"  3 OnPageIndexChange="Grid1_PageIndexChange" OnPreRowDataBound="Grid1_PreRowDataBound" OnRowCommand="Grid1_RowCommand">  4 <Columns>  5 <f:BoundField DataField="Id" HeaderText="位置ID" Width="50px" />  6 <f:TemplateField HeaderText="位置圖" Width="60px">  7 <ItemTemplate>  8 <%# Eval("MapImg").ToString().Length > 5 ? "<a href='" + Eval("MapImg").ToString() + "' target=\"_blank\" class='PicToolTip'><img src='" + DirFileHelper.GetFilePathPostfix(Eval("MapImg")+ "", "s") + "'></a>" : ""%>  9 </ItemTemplate> 10 </f:TemplateField> 11 <f:BoundField Width="150px" DataField="Name" DataFormatString="{0}" DataSimulateTreeLevelField="Depth" HeaderText="名稱" /> 12 <f:BoundField DataField="Keyword" HeaderText="關鍵字" Width="100px" /> 13 <f:BoundField DataField="Width" HeaderText="" /> 14 <f:BoundField DataField="Height" HeaderText="" /> 15 <f:TemplateField HeaderText="排序" Width="100px"> 16 <ItemTemplate> 17 <asp:TextBox ID="tbSort" runat="server" Width="50px" Text='<%# Eval("Sort") %>' AutoPostBack="false"></asp:TextBox> 18 </ItemTemplate> 19 </f:TemplateField> 20 <f:LinkButtonField HeaderText="是否顯示" Icon="BulletCross" TextAlign="Center" ToolTip="點擊修改是否顯示" ColumnID="IsDisplay" CommandName="IsDisplay" /> 21 <f:BoundField DataField="Depth" HeaderText="級別層次" TextAlign="Center" /> 22 <f:LinkButtonField HeaderText="操做" TextAlign="Center" ToolTip="點擊修改當前記錄" ColumnID="ButtonEdit" CommandName="ButtonEdit" /> 23 </Columns> 24 </f:Grid>
View Code

 

 

  打開AdvertisingPositionList.aspx.cs文件,咱們會看到一些調用函數不存在或是提示出錯,那麼咱們就動手建立或修改一下就能夠了

  因爲綁定下拉列表函數咱們的模板沒有生成,因此就手動建立一下

  同理,咱們按InformationClassBll邏輯類的內容,建立AdvertisingPositionBll邏輯類

 1 using System;  2 using System.Collections.Generic;  3 using System.Web.UI;  4 using DotNet.Utilities;  5 using Solution.DataAccess.DataModel;  6  7 /***********************************************************************  8  * 做 者:AllEmpty(陳煥)-- 1654937@qq.com  9  * 博 客:http://www.cnblogs.com/EmptyFS/ 10  * 技 術 羣:327360708 11  * 12  * 建立日期:2014-07-07 13  * 文件名稱:AdvertisingPositionBll.cs 14  * 描 述:廣告位置管理邏輯類 15  * 16  * 修 改 人: 17  * 修改日期: 18  * 修改緣由: 19  ***********************************************************************/ 20 namespace Solution.Logic.Managers 21 { 22 /// <summary> 23 /// AdvertisingPositionBll邏輯類 24 /// </summary> 25 public partial class AdvertisingPositionBll : LogicBase 26  { 27 /*********************************************************************** 28  * 自定義函數 * 29  ***********************************************************************/ 30 31 #region 自定義函數 32 33 #region 綁定廣告位置下拉列表 34 /// <summary> 35 /// 綁定廣告位置下拉列表——只顯示一級廣告位置 36 /// </summary> 37 public void BandDropDownList(Page page, FineUI.DropDownList ddl) 38  { 39 var dt = DataTableHelper.GetFilterData(GetDataTable(), AdvertisingPositionTable.ParentId, "0", AdvertisingPositionTable.Sort, "desc"); 40 41 //顯示值 42 ddl.DataTextField = AdvertisingPositionTable.Name; 43 //綁定Id 44 ddl.DataValueField = AdvertisingPositionTable.Id; 45 46 //綁定數據源 47 ddl.DataSource = dt; 48  ddl.DataBind(); 49 ddl.Items.Insert(0, new FineUI.ListItem("請選擇廣告位置", "0")); 50 ddl.SelectedValue = "0"; 51  } 52 53 /// <summary> 54 /// 綁定廣告位置下拉列表——顯示全部 55 /// </summary> 56 public void BandDropDownListShowAll(Page page, FineUI.DropDownList ddl) 57  { 58 //設置排序 59 var sortList = new List<string>(); 60  sortList.Add(AdvertisingPositionTable.Depth); 61  sortList.Add(AdvertisingPositionTable.Sort); 62 63 //篩選記錄 64 var dt = GetDataTable(false, 0, null, 0, 0, null, sortList); 65 66 try 67  { 68 //整理出有層次感的數據 69 dt = DataTableHelper.DataTableTidyUp(dt, AdvertisingPositionTable.Id, AdvertisingPositionTable.ParentId, 0); 70 71 ddl.EnableSimulateTree = true; 72 73 //顯示值 74 ddl.DataTextField = AdvertisingPositionTable.Name; 75 //綁定Id 76 ddl.DataValueField = AdvertisingPositionTable.Id; 77 //數據層次 78 ddl.DataSimulateTreeLevelField = AdvertisingPositionTable.Depth; 79 //綁定數據源 80 ddl.DataSource = dt; 81  ddl.DataBind(); 82 ddl.SelectedIndex = 0; 83 84 ddl.Items.Insert(0, new FineUI.ListItem("請選擇廣告位置", "0")); 85 ddl.SelectedValue = "0"; 86  } 87 catch (Exception e) 88  { 89 // 記錄日誌 90 CommonBll.WriteLog("", e); 91  } 92  } 93 #endregion 94 95 #endregion 自定義函數 96  } 97 }
View Code

 

  接口函數與數據加載函數在前面的章節已經講述過了,這裏就再也不重複說明

 

  列表屬性綁定,通常指的是頁面中列表的列控件、點擊事件、翻頁事件、排序事件......等各類列表控件事件的綁定,對於翻頁與排序事件,咱們在父類中已經實現了,因此不用再進行處理,而這裏咱們要作的功能是,點擊列表中的狀態項進行更新,好比當前記錄的狀態是容許該記錄顯示出來,那麼點擊後就自動更改成隱藏狀態。

  對於這裏,咱們按下面代碼修改一下

 1 #region 列表屬性綁定  2  3 #region 列表按鍵綁定——修改列表控件屬性  4 /// <summary>  5 /// 列表按鍵綁定——修改列表控件屬性  6 /// </summary>  7 /// <param name="sender"></param>  8 /// <param name="e"></param>  9 protected void Grid1_PreRowDataBound(object sender, FineUI.GridPreRowEventArgs e) 10  { 11 //綁定是否顯示狀態列 12 GridRow gr = Grid1.Rows[e.RowIndex]; 13 if (((System.Data.DataRowView)(gr.DataItem)).Row.Table.Rows[e.RowIndex][AdvertisingPositionTable.IsDisplay].ToString() == "0") 14  { 15 var lbf = Grid1.FindColumn("IsDisplay") as LinkButtonField; 16 lbf.Icon = Icon.BulletCross; 17 lbf.CommandArgument = "1"; 18  } 19 else 20  { 21 var lbf = Grid1.FindColumn("IsDisplay") as LinkButtonField; 22 lbf.Icon = Icon.BulletTick; 23 lbf.CommandArgument = "0"; 24  } 25 26 //綁定是否編輯列 27 var lbfEdit = Grid1.FindColumn("ButtonEdit") as LinkButtonField; 28 lbfEdit.Text = "編輯"; 29 lbfEdit.Enabled = MenuInfoBll.GetInstence().CheckControlPower(this, "ButtonEdit"); 30  } 31 #endregion 32 33 #region Grid點擊事件 34 /// <summary> 35 /// Grid點擊事件 36 /// </summary> 37 /// <param name="sender"></param> 38 /// <param name="e"></param> 39 protected void Grid1_RowCommand(object sender, FineUI.GridCommandEventArgs e) 40  { 41 GridRow gr = Grid1.Rows[e.RowIndex]; 42 //獲取當前點擊列的主鍵ID 43 object id = gr.DataKeys[0]; 44 45 switch (e.CommandName) 46  { 47 case "IsDisplay": 48 //更新狀態 49 AdvertisingPositionBll.GetInstence().UpdateIsDisplay(this, ConvertHelper.Cint0(id), ConvertHelper.Cint0(e.CommandArgument)); 50 //從新加載 51  LoadData(); 52 53 break; 54 case "ButtonEdit": 55 //打開編輯窗口 56 Window1.IFrameUrl = "AdvertisingPositionEdit.aspx?Id=" + id + "&" + MenuInfoBll.GetInstence().PageUrlEncryptStringNoKey(id + ""); 57 Window1.Hidden = false; 58 59 break; 60  } 61  } 62 #endregion 63 64 #endregion
View Code

  對於AdvertisingPositionBll.GetInstence().UpdateIsDisplay()函數的調用,若是沒有細心留意前面章節的朋友,可能會比較奇怪怎麼有這個函數,這是由於咱們在設計數據庫時,全部狀態類的字段都會設置爲tinyint類型,當邏輯層代碼生成模板檢測到字段類型爲tinyint時,就會生成一個更新狀態的函數提供給咱們調用,這樣咱們就無需去編寫這些經常使用的函數了,直接拿來使用便可。

  比較一下這裏列表屬性綁定後的效果

 

  對於記錄刪除函數,通常在刪除前咱們都必須判斷一下,看看該記錄是否已給其餘表引用了,是的話則不能直接刪除(由於直接刪掉的話有可能會引發其餘表使用時的異常或數據同步查詢等問題),另外若是存在圖片的也必須先刪掉圖片,固然圖片刪除函數咱們的邏輯層模板也生成好了,直接引用就能夠了。這些都處理好才直接執行記錄刪除函數刪除記錄。

  因爲咱們的廣告表未建立,因此這裏咱們先將廣告位置是否給廣告表引表的檢查註釋掉。

 

 1         #region 刪除記錄  2 /// <summary>  3 /// 刪除記錄  4 /// </summary>  5 /// <returns></returns>  6 public override string Delete()  7  {  8 //獲取要刪除的ID  9 int id = ConvertHelper.Cint0(GridViewHelper.GetSelectedKey(Grid1, true)); 10 11 //若是沒有選擇記錄,則直接退出 12 if (id == 0) 13  { 14 return "請選擇要刪除的記錄。"; 15  } 16 17 try 18  { 19 //刪除前判斷一下 20 if (AdvertisingPositionBll.GetInstence().Exist(x => x.ParentId == id)) 21  { 22 return "刪除失敗,本廣告位置下面存在子廣告位置,不能直接刪除!"; 23  } 24 //刪除前判斷一下 25 //if (InformationBll.GetInstence().Exist(x => x.AdvertisingPosition_Id == id)) 26 //{ 27 // return "刪除失敗,本廣告位置已被信息表的記錄引用,不能直接刪除!"; 28 //} 29 30 //刪除記錄 31 bll.Delete(this, id); 32 33 return "刪除編號ID爲[" + id + "]的數據記錄成功。"; 34  } 35 catch (Exception e) 36  { 37 string result = "嘗試刪除編號ID爲[" + id + "]的數據記錄失敗!"; 38 39 //出現異常,保存出錯日誌信息 40  CommonBll.WriteLog(result, e); 41 42 return result; 43  } 44  } 45 #endregion
View Code

  這裏還有個地方要同你們講一講,對於頁面列表,咱們選中了一列、或多列時,怎麼取得選中列的主鍵Id呢?這裏咱們能夠調用下面三個函數來獲取:GridViewHelper.GetSelectedKey()——用於獲取選中單條的記錄Id、GridViewHelper.GetSelectedKeyArray()——用於獲取多記錄時的Id數組、GridViewHelper.GetSelectedKeyAll()——用於獲取單選項中,設置了多個綁定字段時,返回這多個字段值的數組。

  對於最後這個,咱們有時候須要選中項傳回多個字段值時,能夠在表格Grid設置屬性DataKeyNames="Id, Name, Keyword",那麼使用GridViewHelper.GetSelectedKeyAll()就能夠獲取當前選中記錄的這三個字段值。

 

  作到這一步,代碼的修改已經算是完成了,咱們執行一下編譯,看看有沒有經過,若是沒有再檢查一下緣由。

  這樣作完後,咱們登錄後端管理系統,並無發現菜單中存在廣告連接,因此接下來咱們要將已完成的廣告註冊到後端管理系統中。

 

  咱們登錄後端管理系統,進入系統管理=》權限管理=》菜單管理,點擊新增按鈕

  爲了方便菜單的管理,咱們先建立廣告管理菜單,以下圖,填寫菜單名稱爲廣告管理;節點不用選擇;填入廣告所在的文件夾路徑;排序號咱們能夠選填寫2,將廣告管理放到信息管理項(該項排序值爲1)的後面,若是填寫0的話,將自動生成同級別最大的排序值,放到最後面;是否菜單或頁面那裏,選擇菜單(在後面綁定頁面控件時,菜單是不能綁定頁面控件的,只有頁面才能綁定);是否顯示這裏固然是選擇在菜單欄中顯示出來。填好後點擊保存生成廣告管理菜單。

  而後咱們添加廣告位置管理菜單

  填寫完之後,咱們刷新頁面發現廣告管理並無在菜單欄顯示出來,這是由於咱們尚未爲當前賬號綁定權限

  在咱們綁定權限前,先要爲頁面綁定控件

  咱們打開系統管理=》權限管理=》頁面權限設置,點擊左欄的廣告位置管理,將添加、編輯、刪除、自動排序、保存排序這幾個控件選擇後點擊中間的>>按鈕,將它們綁定好該頁面

  而後點擊職位管理,找到當前管理所在的部門與職位——技術部--軟件開發工程師

  點擊編輯能夠看到下圖內容,咱們點擊廣告管理就能夠將全部管理項權限都賦給該職位了

 

  而後點擊頂部的,退出系統從新登錄後,就能夠在菜單欄上查看到廣告位置管理連接了

 

 

 

 

  若是對添加、編輯、刪除等按鈕權限沒有打勾或沒有在頁面控件中綁定的話,就會出現下圖狀況,程序默認該用戶對這些按鈕沒有操做權限,打開頁面後頁面將會自動將這些按鈕禁用

 

 

  接着咱們添加廣告編輯頁面

  一樣複製InformationClassEdit.aspx文件並更名爲AdvertisingPositionEdit.aspx

  

  一樣作上面的替換操做

  而後打開AdvertisingPositionEdit.aspx文件,編輯顯示的控件

 1 <f:TextBox runat="server" ID="txtName" Label="位置名稱" ShowRedStar="true" Width="250px">  2 </f:TextBox>  3 <f:TextBox runat="server" ID="txtKey" Label="關鍵字" ShowRedStar="true" Width="250px">  4 </f:TextBox>  5 <f:DropDownList Label="所屬位置選擇" AutoPostBack="true" Required="true" CompareType="String"  6 EnableSimulateTree="true" runat="server" ID="ddlParentId" Width="200px" OnSelectedIndexChanged="ddlParentId_SelectedIndexChanged">  7 </f:DropDownList>  8 <f:TextBox Readonly="true" runat="server" ID="txtParent" Label="父Id" EmptyText="對應的父類Id"  9 Width="100px" Text="0"> 10 </f:TextBox> 11 <f:TextBox runat="server" ID="txtSort" Label="排序" Width="250px" Text="0"></f:TextBox> 12 <f:RadioButtonList ID="rblIsDisplay" Label="是否顯示" ColumnNumber="2" runat="server" 13 ShowRedStar="true" Required="true"> 14 <f:RadioItem Text="顯示" Value="1" Selected="true"/> 15 <f:RadioItem Text="不顯示" Value="0" /> 16 </f:RadioButtonList> 17 <f:FileUpload runat="server" ID="MapImg" Label="位置圖" Width="250px" /> 18 <f:Button runat="server" Text="刪除位置圖" OnClick="BtnDelMapImg_Click"></f:Button> 19 <f:Image runat="server" ID="imgMap"></f:Image> 20 <f:FileUpload runat="server" ID="PicImg" Label="默認廣告圖" Width="250px" /> 21 <f:Button runat="server" Text="刪除默認圖" OnClick="BtnDelPicImg_Click"></f:Button> 22 <f:Image runat="server" ID="imgPic"></f:Image> 23 <f:HiddenField runat="server" ID="hidId" Text="0"></f:HiddenField>
View Code

  對於編輯頁面對應的cs文件,若是頁面比較簡單的話,咱們通常要作的處理就是對對aspx頁面的控件進行賦值操做,還有就是存儲處理。

  對於AdvertisingPositionEdit.aspx.cs文件,一樣咱們也是先在加載數據函數中,對頁面控件進行賦值操做。

  經過邏輯層的GetModelForCache()函數來讀取記錄實體(這裏要注意的是,若是數據表的記錄可能會比較多的時候,咱們就不要使用數據緩存功能,這樣會加大服務器的負擔,咱們直接使用GetModel(id, false)函數直接從數據庫中讀取實體),而後對頁面控件逐個賦值。對於下拉列表的綁定,編輯時不建議開啓修改,由於修改時編輯人員可能會更改當前節點到其餘級別的父類,這樣操做須要在保存函數裏作至關多的判斷處理,增大開發的工做量。

 

 1         #region 加載數據  2 /// <summary>讀取數據</summary>  3 public override void LoadData()  4  {  5 int id = ConvertHelper.Cint0(hidId.Text);  6  7 if (id != 0)  8  {  9 //獲取指定ID的廣告位置內容 10 var model = AdvertisingPositionBll.GetInstence().GetModelForCache(x => x.Id == id); 11 if (model == null) 12 return; 13 14 //地址名稱 15 txtName.Text = model.Name; 16 //給下拉列表賦值 17 ddlParentId.SelectedValue = model.ParentId + ""; 18 //編輯時不能修改父節點 19 ddlParentId.Enabled = false; 20 //設置父ID 21 txtParent.Text = model.ParentId + ""; 22 //設置排序 23 txtSort.Text = model.Sort + ""; 24 //KEY 25 txtKey.Text = model.Keyword; 26 //給頁面圖片賦值 27 if (model.MapImg != null && model.MapImg.Length > 5) 28  { 29 imgMap.ImageUrl = DirFileHelper.GetFilePathPostfix(model.MapImg, "s"); 30  } 31 else 32  { 33 //不存在圖片,則隱藏圖片控件和圖片刪除按鈕 34 imgMap.Visible = false; 35 ButtonDelMapImg.Visible = false; 36  } 37 //給頁面圖片賦值 38 if (model.PicImg != null && model.PicImg.Length > 5) 39  { 40 imgPic.ImageUrl = DirFileHelper.GetFilePathPostfix(model.PicImg, "s"); 41  } 42 else 43  { 44 //不存在圖片,則隱藏圖片控件和圖片刪除按鈕 45 imgPic.Visible = false; 46 ButtonDelPicImg.Visible = false; 47  } 48 //是否顯示(狀態) 49 rblIsDisplay.SelectedValue = model.IsDisplay + ""; 50 51  } 52 else 53  { 54 //新建廣告位置時,隱藏圖片控件和圖片刪除按鈕 55 imgMap.Visible = false; 56 imgPic.Visible = false; 57 ButtonDelMapImg.Visible = false; 58 ButtonDelPicImg.Visible = false; 59  } 60  } 61 62 #endregion
View Code

 

 

 

 

  添加刪除圖片按鈕函數,從下列代碼中能夠看到,刪除函數都是調用模板生成的

 1         #region 刪除圖片  2 /// <summary>  3 /// 刪除位置圖  4 /// </summary>  5 /// <param name="sender"></param>  6 /// <param name="e"></param>  7 protected void ButtonDelMapImg_Click(object sender, EventArgs e)  8  {  9 AdvertisingPositionBll.GetInstence().DelMapImg(this, ConvertHelper.Cint0(hidId.Text)); 10 //刪除後刷新編輯窗口 11  Response.Redirect(Request.Url.ToString()); 12  } 13 14 /// <summary> 15 /// 刪除默認圖片 16 /// </summary> 17 /// <param name="sender"></param> 18 /// <param name="e"></param> 19 protected void ButtonDelPicImg_Click(object sender, EventArgs e) 20  { 21 AdvertisingPositionBll.GetInstence().DelPicImg(this, ConvertHelper.Cint0(hidId.Text)); 22 //刪除後刷新編輯窗口 23  Response.Redirect(Request.Url.ToString()); 24  } 25 #endregion
View Code

 

  進入保存操做時,通常咱們要先對輸入的數據進行檢查,檢查必填項是否爲空,檢查指定項在數據庫中是否存在重複項等內容,而後獲取或建立編輯實體,跟着檢查相關項是否有修改,有的話保存成功後須要同步修改其餘關聯表對應的字段,接着是讀取頁面控件值對實體進行賦值操做,若是有圖片上傳的,則調用上傳方法上傳圖片,再而後就是保存實體,同步更新關聯表字段。

  首先檢查檢查必填項是否爲空,檢查指定項在數據庫中是否存在重複項等內容

 1                 #region 數據驗證  2  3 if (string.IsNullOrEmpty(txtName.Text.Trim()))  4  {  5 return txtName.Label + "不能爲空!";  6  }  7 var sName = StringHelper.FilterSql(txtName.Text, true);  8 if (AdvertisingPositionBll.GetInstence().Exist(x => x.Name == sName && x.Id != id))  9  { 10 return txtName.Label + "已存在!請從新輸入!"; 11  } 12 if (string.IsNullOrEmpty(txtKey.Text.Trim())) 13  { 14 return txtKey.Label + "不能爲空!"; 15  } 16 var sKeyword = StringHelper.FilterSql(txtKey.Text, true); 17 if (AdvertisingPositionBll.GetInstence().Exist(x => x.Keyword == sKeyword && x.Id != id)) 18  { 19 return txtKey.Label + "已存在!請從新輸入!"; 20  } 21 22 #endregion
View Code

  在開發時要注意的是,使用lambda表達式傳遞條件時,必須先計算出值後,將存儲值的變量放到lambda表達式中比較,而不能將計算的表達式做爲值放在lambda表達式中比較,這樣會出錯的。

 

  對相關項進行檢查完畢後,跟着就是進行賦值操做,獲取頁面控件值進行SQL注入過濾或XSS過濾後,將值賦給實體。

  對於頁面控件值的獲取,字符串類型通常都會使用StringHelper.Left(頁面控件, 截取長度)函數來獲取,讓輸入到數據庫的字段值自動去掉兩旁空格,並進行XSS過濾後,截取數據表字段規定的大小後存儲過來,避免相關人員錄入過長數據,而對於須要錄入特殊符號的字段,可使用StringHelper.Left(頁面控件, 截取長度, true, false)函數來獲取,這樣就只進行SQL注入過濾,而不進行XSS過濾,具體請你們查看該函數,裏面有詳細註釋。而對於數值型的則使用相關函數進行轉換。

 

 1                 #region 賦值  2 //定義是否更新其餘關聯表變量  3 bool isUpdate = false;  4  5 //讀取當前地址信息  6 var model = new AdvertisingPosition(x => x.Id == id);  7  8 //判斷是否更新關聯表  9 if (model.Id > 0 && sName != model.Name) 10 isUpdate = true; 11 12 //設置名稱 13 model.Name = StringHelper.Left(txtName.Text, 50); 14 //KEY 15 model.Keyword = StringHelper.Left(txtKey.Text, 50); 16 //對應的父類id 17 model.ParentId = ConvertHelper.Cint0(txtParent.Text); 18 //因爲限制了編輯時不能修改父節點,因此這裏只對新建記錄時處理 19 if (id == 0) 20  { 21 //設定當前的深度與設定當前的層數級 22 if (model.ParentId == 0) 23  { 24 //設定當前的層數級 25 model.Depth = 0; 26  } 27 else 28  { 29 //設定當前的層數 30 model.Depth = ConvertHelper.Cint0(AdvertisingPositionBll.GetInstence().GetFieldValue(ConvertHelper.Cint0(ddlParentId.SelectedValue), AdvertisingPositionTable.Depth)) + 1; 31  } 32 33 //限制分類層數只能爲2層 34 if (model.Depth > 2) 35  { 36 return "廣告位置只能建立2層分類!"; 37  } 38  } 39 //設置排序 40 if (txtSort.Text == "0") 41  { 42 model.Sort = AdvertisingPositionBll.GetInstence().GetSortMax(model.ParentId) + 1; 43  } 44 else 45  { 46 model.Sort = ConvertHelper.Cint0(txtSort.Text); 47  } 48 //設定當前項是否顯示 49 model.IsDisplay = ConvertHelper.StringToByte(rblIsDisplay.SelectedValue); 50 51 //廣告寬與高 52 model.Width = ConvertHelper.Cint0(txtWidth.Text); 53 model.Height = ConvertHelper.Cint0(txtHeight.Text); 54 55 //添加最後修改人員 56 model.Manager_Id = OnlineUsersBll.GetInstence().GetManagerId(); 57 model.Manager_CName = OnlineUsersBll.GetInstence().GetManagerCName(); 58 model.AddDate = DateTime.Now; 59 60 #endregion
View Code

 

 

 

 

  若是頁面須要上傳圖片的,則必須先在系統管理=》基礎設置=》上傳配置管理中,添加一項新的配置,取得新建的配置Id後,再使用圖片上傳方法來上傳圖片。具體上傳類的使用我會在後面的章節單獨講解。

  代碼中綁定好對應的Id

 

 

 

  最後是將實體保存到數據庫,以及同步更新關聯表字段,因爲廣告表未建立,因此暫時註釋掉代碼。

 

  接下來要作的仍是菜單註冊與權限綁定操做,這裏就再也不繼續重複了。

 

  最終編輯頁面實現效果:

 

 

  上面內容看起來好像很是多很複雜的樣子,實際上只要你作過幾個例子,而後熟悉本框架的開發模式後就會感受簡單多了,整個操做來看,編碼部分相對來講比較少,且絕大部分都是調用已生成好的模板函數,也就是說只要你熟悉了模板函數,想實現什麼樣的功能都不是很難,同時也不用本身編寫大量的邏輯層以及數據層代碼,一鍵生成。想輕鬆的使用本框架開發新功能,必須學會FineUI插件的相關調用,FineUI官方有在線示例,都比較簡單。其實只要你將FineUI的控件屬性,在頁面中直接修改後刷新頁面,查看其變化,逐個測試事後你就基本上掌握了,很是簡單,我也是這樣學習的。

  整個操做所花費的時間更可能是用在數據庫表單的設計、UI的繪製,以及頁面開發完成後在後端權限模塊進行註冊綁定。

  使用本框架開發,更多的是讓開發人員從複製粘貼工做中解放出來,不用編寫大量的底層重複函數,更多的關注UI的製做以及業務邏輯設計。由於底層模塊會將日誌、安全檢查、經常使用函數.....等功能已經幫咱們實現了。

 

 

因爲框架不是很是成熟,不少朋友不是用來學習而是直接用到項目中,但不熟悉框架引發很多小問題,因此中止提供下載,有須要學習的能夠到羣共享裏下,不便之處敬請諒解。

 

 

 

版權聲明:
  本文由AllEmpty原創併發佈於博客園,歡迎轉載,未經本人贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接,不然保留追究法律責任的權利。若有問題,能夠經過1654937@qq.com 聯繫我,很是感謝。

 

  發表本編內容,只要主爲了和你們共同窗習共同進步,有興趣的朋友能夠加加Q羣:327360708 ,你們一塊兒探討。

 

  更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

 

只有將本身置空,才能裝進更多的東西
相關文章
相關標籤/搜索