亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Scott Mitchell 的ASP.NET 2.0數據教程之四十三

系統 2041 0


Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制


導言

很多支持帳號(即需要登陸)的web程序根據登陸的用戶提供不同的選項,報表和其它功能。回到基于用戶對修改數據進行限制 里,我們學習了如何根據當前用戶來動態調整在DetailsView和GridView里修改數據的能力。它允許用戶可以作為supplier或employee登陸到站點。如果登陸的用戶為supplier,他將可以修改他提供的product信息和company信息。而employee可以修改任何公司的product和supplier信息。

注意:在基于用戶對修改數據進行限制里,用戶通過從下拉列表里選擇訪問權限級別來登陸到站點(無論他們可以編輯所有或一個supplier)。ASP.NET 2.0的membership 系統為創建管理和驗證用戶帳號提供了一個標準的可擴展的平臺。然而詳細的討論membership 超出了本章的范圍,更多的membership 的信息參考Examining ASP.NET 2.0’s Membership, Roles, and Profile

本章我們將學習如何使用DataList來根據當前登陸用戶來顯示數據修改功能。我們將創建一個列出employee 信息的頁—name, title, 和hire date —在一個可編輯的DataList里。匿名用戶將不能編輯任何employees 信息,見圖1。而登陸用戶可以編輯他自己的employee 記錄以及他管理的所有employee 信息。見圖2。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 1: 匿名用戶不能編輯任何Employee的 Record

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制

圖 2: 登陸用戶可以編輯他自己的employee 記錄以及他管理的所有employee 信息

由于employee的管理職位決定了他可以編輯那些記錄,因此當測試本章的例子時候,熟悉Northwind 的組織等級是非常重要的。你可以使用圖3的等級圖作為參考。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 3: Northwind 組織等級圖

現在我們開始!

第一步: 登陸到站點

在ASP.NET 2.0程序里,我們使用membership 和安全控件來保存用戶帳號信息,鑒別用戶,將用戶帳號和employees關聯。為了在數據處理上集中精力,我們將放棄創建membership,而是允許用戶在DropDownList挑選他想作為哪個employee 來登陸。


打開EditDeleteDataList文件夾里的UserLevelAccess.aspx頁,拖一個DropDownList 進來,將ID設為LoggedOnAs。從它的智能標簽里創建一個名為LoggedOnAsDataSouce的ObjectDataSouce。使用EmployeesBLL類的GetEmployees()方法配置它。見圖4。將LastName字段作為顯示,EmployeeID作為value。見圖5。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 4: 配置ObjectDataSource

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制

圖 5: 配置DropDownList的Text和Value


現在LoggedOnAs DropDownList 顯示每個employee的last name。為了對用戶顯示正確的數據修改界面,我們還需要處理匿名用戶。因此,我們在DropDownList 里添加一個靜態的項,Text為“Anonymous Visitor”,value 為“-1”,見圖6。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 6: 向DropDownList里添加“Anonymous Visitor”

注意要將DropDownList的AppendDataBoundItems屬性設為True.默認的,綁定的數據項—比如從ObjectDataSouce綁定的employees — 會覆蓋靜態添加的項。將這個屬性設為True后,綁定的employee 會附加在靜態數據的后面(“Anonymous Visitor”).最后將DropDownList的AutoPostBack屬性設為True.完成這些后,頁面的聲明代碼看起來應該如下:

ASP.NET

You are logged on as:
<asp:DropDownList ID="LoggedOnAs" AutoPostBack="True"
AppendDataBoundItems="True" DataSourceID="LoggedOnAsDataSource"
DataTextField="LastName" DataValueField="EmployeeID" runat="server">
<asp:ListItem Value="-1">Anonymous Visitor</asp:ListItem>
</asp:DropDownList>
<asp:ObjectDataSource ID="LoggedOnAsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetEmployees" TypeName="EmployeesBLL">
</asp:ObjectDataSource>

瀏覽該頁。下拉列表現在包含一個“Anonymous Visitor”選項和每個employees 的last name。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 7: 下拉列表的樣子


用戶可以從下拉列表里選擇一個employee 然后登陸到站點,這時系統會認為他是作為他選擇的用戶登陸進來的。


第二步: 創建可編輯的DataList

完成了“假的”登陸界面后,下一步我們來創建可編輯的DataList ,和根據“登陸”的用戶來限制他的數據修改能力。我們首先創建一個全部可編輯的DataList (象前面教程里做的那樣)。完成這個后,我們再來限制用戶的修改能力。如我們在前面教程里看到的,創建可編輯的DataList 需要:


添加DataList 并創建只讀界面
創建編輯界面
為DataList的EditCommand, CancelCommand, 和UpdateCommand events寫事件處理

我們來分別實現這些步驟。

創建只讀界面

首先拖一個DataList 進來。將ID設為Employees,然后通過智能標簽創建一個名為EmployeesDataSouce的ObjectDataSouce。用EmployeesBLL類的GetEmployees()方法配置它,和我們配置LoggedOnAsDataSouce一樣(可以參考圖4。)

配置完數據源后,Visual Studio會自動為DataList創建ItemTemplate,顯示每個字段的name和value。編輯ItemTemplate讓它只顯示employee 的name,title和hire date。然后添加一個Button, LinkButton, 或ImageButton 作為編輯按鈕。完成這些后,ItemTemplate看起來應該如下:


ASP.NET


<ItemTemplate>
<h4>
<asp:Label ID="FirstNameLabel" runat="server"
Text='<%# Eval("FirstName") %>' />
<asp:Label ID="LastNameLabel" runat="server"
Text='<%# Eval("LastName") %>' />
</h4>
Title:
<asp:Label ID="TitleLabel" runat="server"
Text='<%# Eval("Title") %>' />
<br />
Hire Date:
<asp:Label ID="HireDateLabel" runat="server"
Text='<%# Eval("HireDate", "{0:d}") %>' />
<br />
<br /><br />
<br /><br />
<asp:Button runat="server" ID="EditButton"
CommandName="Edit" Text="Edit" />
<br /><br />
</ItemTemplate>

注意:為HireDateLabel的Text屬性賦值的數據綁定表達式指定了一個短日期格式。格式說明作為Eval方法的第二個參數傳進去。更多的數據綁定語法里指定格式的信息請參考在DetailsView控件中使用TemplateField 。圖8是現在瀏覽該頁的樣子。由于EditCommand事件處理還沒有被創建,現在點編輯按鈕會引起postback但不會讓item變為可編輯的。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 8: 顯示Employee的 Name, Title, 和Hire Date

創建編輯界面


完成只讀界面后,下面需要創建編輯界面。我們的編輯界面— 在DataList的EditItemTemplate里描敘的— 使用TextBox 來顯示每個字段。然后添加更新和取消按鈕。不要忘了將button的CommandName屬性分別設為Update” 和“Cancel”。另外還要添加RequiredFieldValidators 來確保用戶輸入了first name和last name,添加CompareValidator 來檢查hire date 的值是合法的日期值。在頁里添加一個ValidationSummary 控件,并將Cancel button的CausesValidation屬性設為False.

注意:更多的在ASP.NET 2.0里使用驗證控件的信息請參考Validating Form Input Controls 。


由于前面的教程里我們已經創建過編輯界面了,我們現在直接看看聲明代碼是什么樣子。創建DataList編輯界面的詳細信息請參考綜敘:在DataList里編輯和刪除數據 和自定義DataList編輯界面 。


ASP.NET

<EditItemTemplate>
First Name:
<asp:TextBox runat="server" ID="FirstName" Columns="10" MaxLength="10"
Text='<%# Eval("FirstName") %>' />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="FirstName"
ErrorMessage="You must provide the employee's first name."
runat="server">*</asp:RequiredFieldValidator>
<br />
Last Name:
<asp:TextBox runat="server" ID="LastName" Columns="20" MaxLength="20"
Text='<%# Eval("LastName") %>' />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2"
ControlToValidate="LastName"
ErrorMessage="You must provide the employee's last name."
runat="server">*</asp:RequiredFieldValidator>
<br />
Title:
<asp:TextBox runat="server" ID="Title" Text='<%# Eval("Title") %>'
Columns="30" MaxLength="30" />
<br />
Hire Date:
<asp:TextBox runat="server" ID="HireDate" Columns="15"
Text='<%# Eval("HireDate", "{0:d}") %>' />
<asp:CompareValidator ID="CompareValidator1" ControlToValidate="HireDate"
ErrorMessage="The hire date must be a valid date value."
Operator="DataTypeCheck" Type="Date"
runat="server">*</asp:CompareValidator>
<br />
<br />
<asp:Button ID="UpdateButton" runat="server"
Text="Update" CommandName="Update" />
&nbsp;&nbsp;&nbsp;
<asp:Button ID="CancelButton" Text="Cancel" CausesValidation="False"
CommandName="Cancel" runat="server" />
</EditItemTemplate>

現在編輯界面里還沒有什么東西。我們可以通過設計器瀏覽編輯界面。從DataList的智能標簽里選擇“編輯模板”然后選擇EditItemTemplate。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 9: 通過設計器預覽編輯界面

完成 EditCommand, CancelCommand, 和UpdateCommand Event Handlers


完成ItemTemplate和EditItemTemplate后,最后一步是為EditCommand,CancelCommand和UpdateCommand事件寫事件處理。這些事件在用戶點編輯,取消和更新按鈕時被激發。EditCommand和CancelCommand事件要做的只是更新了EditItemIndex屬性并將數據重新綁定到DataList—EditCommand事件處理將被點了編輯按鈕的項的索引賦值給EditItemIndex,而CancelCommand事件處理將EditItemIndex的值還原為 -1:


C#

protected void Employees_EditCommand(object source, DataListCommandEventArgs e)
{
// Set the EditItemIndex to the index of the item whose Edit button was clicked
Employees.EditItemIndex = e.Item.ItemIndex;
Employees.DataBind();
}
protected void Employees_CancelCommand(object source, DataListCommandEventArgs e)
{
// Return the DataList to its pre-editing state
Employees.EditItemIndex = -1;
Employees.DataBind();
}

增加了這兩個事件處理后,瀏覽該頁。見圖10,點編輯按鈕會讓employee 變為可編輯,點取消按鈕會讓DataList返回到編輯前的狀態,并且任何修改都不會被保存。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 10: 編輯和取消按鈕的功能都完成了


UpdateCommand事件處理負責將用戶的修改提交到數據庫。這個可以通過下面的步驟完成:

訪問 DataList的DataKeys 集合來獲取被編輯的to employee的 EmployeeID .
從編輯界面獲取更新后的值.如我們在前面的教程里看到的,這個可以通過 FindControl("controlID") 方法來編程引用 EditItemTemplate.里的 TextBox 來完成。
調用合適的BLL 方法來更新.

現在我們的程序還沒有包含更新employee 信息的方法。我們需要在DAL的EmployeesDataTable和BLL的EmployeesBLL里分別添加一個方法。在創建一個數據訪問層 和創建一個業務邏輯層 里有詳細的介紹。

本章的焦點內容是如何根據當前的登陸用戶來自定義數據修改權限。因此上面的添加更新方法將作為練習留給讀者自己完成。在這里我只簡單的創建一個UpdateCommand事件處理來顯示一個客戶端消息框,告訴用戶更新的功能還沒有被實現。

C#

protected void Employees_UpdateCommand(object source, DataListCommandEventArgs e)
{
// Display a client-side messagebox explaining that the updating capabilities
// are not yet implemented
Page.ClientScript.RegisterStartupScript(this.GetType(),
"NotYetImplemented",
@"alert('Update capabilities are not yet implemented and are left" +
" as an exercise to the reader - that\'s you!');", true);
// Return the DataList to its pre-editing state
Employees.EditItemIndex = -1;
Employees.DataBind();
}


注意:Page.ClientScript屬性是ClientScriptManager class的一個實例,它包含了一些可以通過編程來在ASP.NET page里生成客戶端腳本的方法。更多的信息參考Client Script in ASP.NET Web Pages 和Working with Client-Side Script 。

點編輯按鈕會出現一個提示框,見圖11。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 11: 更新功能作為一個練習留給讀者完成

第三步: 根據登陸用戶來限制編輯的權限

現在,任何用戶—包括匿名用戶—都可以編輯任何的employee信息。我們需要阻止這種情況,而只讓授權用戶來編輯他們自己的和他們管理的employees 的(如果有的話)記錄。唯一例外情況是如果用戶沒有上級,他就可以編輯所有的employees 記錄。

為了阻止用戶編輯他沒有被授權編輯的employees ,我們可以隱藏這些employees 的編輯按鈕。DataList的ItemDataBound事件在每次數據綁定到DataList時激發。我們可以創建一個事件處理來判斷當前登陸的用戶是否有權編輯記錄,然后決定是否顯示相對應的編輯按鈕。

C#
// A page-level variable holding information about the currently "logged on" user
Northwind.EmployeesRow currentlyLoggedOnUser = null;
protected void Employees_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem ||
e.Item.ItemType == ListItemType.Item)
{
// Determine the Manager of the Employee record being bound
// to this DataListItem
Northwind.EmployeesRow employee =
(Northwind.EmployeesRow)((System.Data.DataRowView)e.Item.DataItem).Row;
// Read in the information for the currently "logged on" user, if needed
if (currentlyLoggedOnUser == null &&
Convert.ToInt32(LoggedOnAs.SelectedValue) > 0)
{
EmployeesBLL employeeAPI = new EmployeesBLL();
currentlyLoggedOnUser =
employeeAPI.GetEmployeeByEmployeeID(
Convert.ToInt32(LoggedOnAs.SelectedValue))[0];
}
// See if this user has access to edit the employee
bool canEditEmployee = false;
if (currentlyLoggedOnUser != null)
{
// We've got an authenticated user... see if they have no manager...
if (currentlyLoggedOnUser.IsReportsToNull())
canEditEmployee = true;
else
{
// ok, this person has a manager...
// see if they are editing themselves
if (currentlyLoggedOnUser.EmployeeID == employee.EmployeeID)
canEditEmployee = true;
// see if this person manages the employee
else if (!employee.IsReportsToNull() &&
employee.ReportsTo == currentlyLoggedOnUser.EmployeeID)
canEditEmployee = true;
}
}
// Referrence the Edit button and set its Visible property accordingly
Button editButton = (Button)e.Item.FindControl("EditButton");
editButton.Visible = canEditEmployee;
}
}

在ItemDataBound事件處理前是一個頁面級的變量currentlyLoggedOnUser。這個變量用來保存用戶在LoggedOnAs下拉列表里選擇的employee 信息,并在ItemDataBound里使用。真實情況下,這樣的數據一般都通過session變量來保存。

由于ItemDataBound事件在所有項加到DataList里時都會激發— headers, footers, separators, items, editable items,等— 因此在事件處理的最開始要先確保我們處理的是一個item 或alternating item。然后通過DataItem屬性來引用剛剛綁定到DataListItem的employee 數據,并賦給一個EmployeeRow對象。跟著當前登陸用戶的信息被讀到currentlyLoggedOnUser變量里。

一旦我們有了當前登陸用戶和剛綁定到DataList的employee 的信息,我們可以運用我們的邏輯出來來決定employee 數據是否可以被編輯。如果currentlyLoggedOnUser還是空的,我們就知道當前用戶是匿名的,他不能編輯任何記錄。如果不是空的,我們就檢查他是否不從屬于任何人,如果是這樣,他就可以編輯任何employee記錄。如果他從屬于某個人,他就只能在當前記錄是自己的或者當前記錄從屬于他的情況下編輯當前的employee 。最后通過FindControl("controlID")方法來獲的編輯按鈕的引用,并設置它的Visible屬性。

第一次瀏覽該頁時,匿名用戶是被默認選中的,因此會隱藏所有employee 記錄的編輯按鈕。見圖12。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 12: 匿名用戶不能編輯任何記錄


從LoggedOnAs下拉列表里選擇不同的employee 會引起postback(由于我們將它的AutoPostBack屬性設為True),但是DataList并沒有被更新。由于DataList的ObjectDataSouce并沒有使用基于DropDownList的參數,在postback時不會請求數據綁定到DataList。因此我們需要手動來讓DataList重新綁定數據。

為DropDownList的SelectedIndexChanged事件創建事件處理,并添加以下代碼:

C#

protected void LoggedOnAs_SelectedIndexChanged(object sender, EventArgs e)
{
// Make sure editing is disabled and rebind the data to the DataList
Employees.EditItemIndex = -1;
Employees.DataBind();
}


調用DataList的DataBind()方法來讓數據重新綁定到DataList。這個會引起ItemDataBound事件在添加每個item時又被激發,從而使編輯按鈕根據新選擇的用戶判斷來顯示或者隱藏。在調用DataBind()方法前,將EditItemIndex屬性設為-1來保證DataList為只讀狀態。如果沒有這行代碼,用戶點了一個項的編輯按鈕,然后選擇一個新用戶后,剛才可編輯的項現在仍然將保持為可編輯的狀態。由于用戶可能從一個可編輯某項的帳號換到另一個不可編輯此項的帳號,因此我們要避免這樣的情況。


完成了SelectIndexChanged事件處理后,瀏覽該頁。見圖13。當作為Davolio登陸時,只有Nancy Davolio的信息是可編輯的,如果作為Buchanan 登陸的話有四條記錄可編輯— Steven Buchanan 和他的三個下屬: Michael Suyama, Robert King, 和Anne Dodsworth ,見圖14。如果作為Fuller登陸的話,所有的記錄都是可編輯的,見圖15。

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制
圖 13: Davolio 只能編輯她自己的Employee 信息

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制

圖 14: Buchanan 可以編輯四條記錄— 他自己的和他下屬的

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制

圖 15: Fuller 沒有上級, 因此他可以編輯所有Employee 記錄
注意:如果編輯employee 信息的規則—employee只能編輯他自己的和他下屬的信息,在他沒有上級的情況下他可以編輯所有的記錄—不僅僅在這頁使用,而是整個程序通用的,那么可以在BLL里添加這些邏輯。在EmployeesBLL類的UpdateEmployee方法里(留給讀者完成的)你可以在當前登陸用戶編輯他沒有權限編輯的信息的情況下拋出異常。更多拋出和處理異常的信息請參考處理BLL和DAL的異常 。


總結

很多支持帳號(即需要登陸)的站點根據登陸的用戶提供不同的數據修改界面。管理員可能可以刪除或編輯任何記錄,而非管理員用戶只能編輯和刪除他們自己創建的記錄。不管情況是怎樣,DataList和BLL都可以擴展到根據當前登陸用戶添加和拒絕某個功能。本章我們學習了如何根據登陸用戶來限制那些記錄可以被編輯。本章也結束了我們對使用DataList來插入更新和刪除數據的學習。下一章開始我們將轉向排序和分頁。


祝編程愉快!

Scott Mitchell 的ASP.NET 2.0數據教程之四十三::基于用戶對修改數據進行限制


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 美女被羞羞产奶视频网站 | 亚洲国产欧美一区二区欧美 | 尤物国产在线精品福利一区 | 欧美国产亚洲精品a第一页 欧美国产亚洲精品高清不卡 | 可以免费观看欧美一级毛片 | 天天操夜夜骑 | 国产欧美视频一区二区三区 | 青草久草 | 四虎影视在线永久免费观看 | 午夜视频免费国产在线 | 99热视热频这里只有精品 | 成人午夜爱爱爱爱爱 | 狠狠色丁香婷婷综合精品视频 | 四虎影院新网址 | 中文字幕在线播放一区 | 日本特级爽毛片叫声 | 一级毛片真人不卡免费播 | 狠色狠色狠狠色综合久久 | 夜夜骑夜夜操 | 中文字幕av在线 | 国产一区二区三区在线观看精品 | 国产精品亚洲精品久久成人 | 久久久久99 | 奇米777在线观看 | 国产成人18黄网站免费 | 亚洲国产精品久久久天堂 | 免费大片黄在线观看yw | 国产亚洲精品一区二区 | 成人5252色| 擼擼色在线看观看免费 | 国产日 | 国产成人精品男人的天堂538 | 亚洲国产第一区二区香蕉 | 欧美激情aa毛片 | 日韩一级在线 | 久久99免费 | 91国内在线视频 | 黄色网毛片| 日韩在线视频不卡 | 热久久精品 | 亚洲精品字幕一区二区三区 |