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


  頁面權限與頁面控件權限經過簡單的調試后,終於啟用起來了,以后大家添加新頁面時,就必須按照本章介紹的方法,將你新增的頁面注冊到系統中,這樣才能訪問與進行相關操作。

  下面講講如何創建一個分類類型的頁面。

  分類類型,顧名思義指的是按照一定規律、特點進行歸類划分,放到一塊的集合。我們開發時這些分類類型,經常用下拉列表來表現,如果有多級分類時,采用的是下拉樹列表方式顯示。

  普通下拉列表

  

  下拉樹列表

  

 

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

  

  首先,我們先要創建好數據表

  我們打開數據字典,按數據字典中的格式,創建一個廣告位置管理表

   然后打開大神July提供的SQL語句生成工具,生成數據表創建語句

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

   生成下面語句

   將生成的語句放到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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM