成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > 在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對(duì)修改數(shù)據(jù)進(jìn)行限制

在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對(duì)修改數(shù)據(jù)進(jìn)行限制

熱門(mén)標(biāo)簽:地圖標(biāo)注軟件免費(fèi)下載 百應(yīng)電話機(jī)器人外呼系統(tǒng) 臨沂智能電話機(jī)器人加盟 400電話辦理怎么樣 網(wǎng)絡(luò)電話外呼系統(tǒng)上海 外呼電話機(jī)器人成本 西寧呼叫中心外呼系統(tǒng)線路商 聯(lián)通官網(wǎng)400電話辦理 蘇州如何辦理400電話

導(dǎo)言

  很多Web程序都支持用戶帳號(hào),根據(jù)不同的登錄用戶提供不同的選項(xiàng),報(bào)表等功能。例如,就我們的教程中,我們要允許供應(yīng)商公司的一些賬戶能登錄網(wǎng)站并更新它們的產(chǎn)品-包括產(chǎn)品名稱(chēng)和單價(jià),或許還有供應(yīng)商的信息,比如它們的公司名稱(chēng),地址,以及聯(lián)系人信息等等。此外,可能我們還想包含一些帳號(hào)留給我們自己公司用戶,以便讓它們能夠登錄并進(jìn)行產(chǎn)品信息修改,比如股價(jià),級(jí)別調(diào)整等等。我們的Web程序同時(shí)也可以允許匿名登錄,但是僅僅讓這些用戶瀏覽數(shù)據(jù)。并包含一個(gè)系統(tǒng)用戶,通過(guò)對(duì)ASP.NET頁(yè)面中的數(shù)據(jù)控件能夠進(jìn)行數(shù)據(jù)的增,改,刪。

  在這篇教程中,我們將考察如何動(dòng)態(tài)地根據(jù)不同的訪問(wèn)用戶來(lái)調(diào)整數(shù)據(jù)的修改能力。更進(jìn)一步,我們新建一個(gè)頁(yè)面,通過(guò)一個(gè)可編輯的DetailsView來(lái)顯示供應(yīng)商信息,以及一個(gè)GridView控件列出供應(yīng)商提供的產(chǎn)品。如果訪問(wèn)者來(lái)自我們公司,它們可以查看任何供應(yīng)商信息,編輯他們的地址,編輯任何一個(gè)供應(yīng)商提供的產(chǎn)品信息。然而,如果用戶來(lái)自某個(gè)具體某個(gè)公司,它們只能查看和修改他們自己公司的地址信息,或者修改他們那些沒(méi)有缺貨的商品信息。

圖1:一個(gè)來(lái)自我們公司的用戶可以編輯任何一個(gè)供應(yīng)商信息

圖2:一個(gè)來(lái)自某個(gè)供應(yīng)商公司的他只能查看和編輯他們自己的信息

讓我們開(kāi)始吧!

  注意:ASP.NET 2.0的MemberShip體系提供了一個(gè)可以創(chuàng)建,管理,驗(yàn)證用戶帳號(hào)的標(biāo)準(zhǔn)的,可以擴(kuò)展的平臺(tái)??紤]到考察membership體系已經(jīng)超出了本文的內(nèi)容,本文將假設(shè)匿名用戶已經(jīng)通過(guò)了membership體系,可以認(rèn)為他們是來(lái)自一個(gè)具體的供應(yīng)商或者是我們公司。有關(guān)更多membership的內(nèi)容,可以參考我的 考察ASP.Net 2.0 的Membership, Roles, Profiles文章系列。

第一步: 允許用戶能夠指定他們的訪問(wèn)權(quán)限

  在實(shí)際的Web應(yīng)用程序中,一個(gè)用戶的帳號(hào)信息已經(jīng)包含了識(shí)別他們是來(lái)自我們公司或者供應(yīng)商,而且這種信息在用戶一登錄之后便可以在ASP.NET中代碼訪問(wèn)到。這個(gè)信息可以通過(guò)ASP.NET 2.0的角色體系獲取,作為檔案系統(tǒng)或者其他業(yè)務(wù)上的用戶帳號(hào)信息。

  由于這篇教程是示范針對(duì)不同登錄用戶調(diào)整數(shù)據(jù)修改的能力, 并不是要凸顯使用ASP.NET 2.0的membership,roles,和profile系統(tǒng),我們會(huì)使用一種很簡(jiǎn)單的機(jī)制來(lái)決定用戶訪問(wèn)網(wǎng)頁(yè)的這種能力-通過(guò)一個(gè)下拉框,用戶可以選擇他們想要查看或修改任何一個(gè)供應(yīng)商的信息,或者是作為一個(gè)供應(yīng)商,只能查看和修改自己的信息。如果用戶使用默認(rèn)的可以查看和修改任何供應(yīng)商信息,那么她分頁(yè)查看所有的供應(yīng)商,編輯他們的地址信息,以及編輯選擇的某個(gè)供應(yīng)商的產(chǎn)品的名字或者單價(jià)。如果選擇了只能查看和編輯某個(gè)供應(yīng)商的信息,那么她只能查看這個(gè)供應(yīng)商的產(chǎn)品具體信息,更新那些沒(méi)有過(guò)期的產(chǎn)品的名稱(chēng)和單價(jià)。

  接下來(lái)我們將要新建一個(gè)DropDownList并給它填充系統(tǒng)供應(yīng)商信息數(shù)據(jù)。打開(kāi)EditInsertDelete文件夾下的UserLevelAccess.aspx頁(yè)面,添加一個(gè)DropDownList控件,設(shè)置它的ID屬性為Suppliers,并綁定到一個(gè)命名為AllSuppliersDataSource的ObjectDataSource控件。

圖3:創(chuàng)建一個(gè)名為AllSuppliersDataSource的ObjectDataSource控件

  因?yàn)槲覀兿胍狣ropDownList顯示所有的供應(yīng)商,我們配置ObjectDataSource調(diào)用SuppliersBLL類(lèi)中的GetSuppliers()方法。同時(shí)確保控件的Update()方法映射到SuppliersBLL類(lèi)的UpdateSupplierAddress方法,而這個(gè)ObjectDataSource控件將同時(shí)被下一步中的DetailsView控件使用。完成ObjectDataSource的設(shè)置后,再完成設(shè)置Suppliers下拉框控件,讓它的每個(gè)ListItem顯示數(shù)據(jù)成員為CompanyName,數(shù)據(jù)成員的值為SupplierID。

圖4:配置Suppliers DropDownList使用CompanyName和SupplierID數(shù)據(jù)成員

  到這里,這個(gè)DropDownList列出了數(shù)據(jù)庫(kù)中的所有供應(yīng)商的名字。然而,我們還需要對(duì)下拉框添加一個(gè)“顯示/編輯所有供應(yīng)商”的選項(xiàng)。可以通過(guò)設(shè)置Suppliers下拉框的AppendDataBoundItem屬性為true,并添加一個(gè)ListItem,設(shè)置它的Text屬性為“顯示/編輯所有供應(yīng)商”,value屬性為-1來(lái)實(shí)現(xiàn)。這些可以通過(guò)直接聲明標(biāo)記語(yǔ)言或者在屬性窗口的設(shè)計(jì)器中點(diǎn)擊下拉框的Item屬性來(lái)添加完成。

  注意:可以回頭參考教程《使用DropDownList過(guò)濾的主/從報(bào)表 》獲得關(guān)于添加一個(gè)下拉框中“顯示所有”選項(xiàng)的詳細(xì)討論。通過(guò)設(shè)置AppendDataBoundItems屬性和添加ListItem后,這個(gè)DropDownList的聲明標(biāo)記如下所示:

asp:DropDownList ID="Suppliers" runat="server" AppendDataBoundItems="True"
  DataSourceID="AllSuppliersDataSource" DataTextField="CompanyName"
  DataValueField="SupplierID">
  asp:ListItem Value="-1">Show/Edit ALL Suppliers/asp:ListItem>
/asp:DropDownList>

圖5是一個(gè)當(dāng)前在瀏覽器中操作的截圖。

  圖5:包含一個(gè)“Show ALL”的ListItem的Suppliers下拉框,以及其他每個(gè)供應(yīng)商名稱(chēng)

  由于我們想讓用戶改變選擇后,立刻更新用戶界面,我們需要設(shè)置Suppliers下拉框的AutoPostBack屬性值為true。在第二步中我們將創(chuàng)建一個(gè)DetailsView控件來(lái)顯示基于用戶選擇后顯示的供應(yīng)商詳細(xì)信息。然后,在第三步中,我們會(huì)創(chuàng)建一個(gè)下拉框的SelectedIndexChanged事件的處理器,在代碼里面我們將根據(jù)當(dāng)前的選擇來(lái)把具體的供應(yīng)商信息綁定到DetailsView控件中。

第二步:添加一個(gè)DetailsView控件

  讓我們使用DetailsView控件來(lái)顯示供應(yīng)商信息。對(duì)于能夠查看和編輯所有供應(yīng)商信息的用戶,這時(shí)DetailsView將支持分頁(yè),并允許用戶逐個(gè)查看每個(gè)供應(yīng)商資料。如果用戶是其中的某個(gè)供應(yīng)商,這時(shí)DetailsView將只顯示當(dāng)前這個(gè)供應(yīng)商信息,而且不會(huì)包含分頁(yè)的界面。在兩種情況下,DetailsView都將允許用戶能夠編輯所能訪問(wèn)到的供應(yīng)商的地址,城市和國(guó)家等屬性值。

  在Suppliers下拉框下添加一個(gè)DetailsView,并設(shè)置它的ID屬性為SupplierDetails,然后把它綁定到前面創(chuàng)建的AllSuppliersDataSource ObjectDataSource控件。之后,在DetailsView的智能標(biāo)簽中打開(kāi)Enable Paging和Enable Editing 的多選框。

  注意:如果你在DetailsView標(biāo)簽代碼中沒(méi)有看到Enable Edit屬性,那是因?yàn)槟銢](méi)有把ObjectDataSource的Update()方法

  綁定到SuppliersBLL類(lèi)的UpdateSupplierAddress方法?;ㄒ稽c(diǎn)事件回過(guò)去重新設(shè)置一下,然后再回來(lái)就能看到Enable Edit屬性。由于SuppliersBLL類(lèi)的UpdateSupplierAddress方法只允許有四個(gè)參數(shù)-supplierID,address,city以及country,需要修改DetailsView的BoundFields讓CompanyName和Phone兩個(gè)BoundFields是read-only。此外,把SupplierID這個(gè)BoundField完全刪除。最后,這個(gè)AllSuppliersDataSource控件已經(jīng)含有一個(gè)OldValuesParameterFormatString屬性,值為original_{0}。再花些時(shí)間把它完全刪除或者修改它的值為默認(rèn)值{0}。通過(guò)對(duì)SupplierDetails這個(gè)DetailsView控件以及對(duì)AllSuppliersDataSource這個(gè)ObjectDataSource控件的設(shè)置,我們的代碼將如下所示:

asp:ObjectDataSource ID="AllSuppliersDataSource" runat="server"
  SelectMethod="GetSuppliers" TypeName="SuppliersBLL"
  UpdateMethod="UpdateSupplierAddress">
  UpdateParameters>
    asp:Parameter Name="supplierID" Type="Int32" />
    asp:Parameter Name="address" Type="String" />
    asp:Parameter Name="city" Type="String" />
    asp:Parameter Name="country" Type="String" />
  /UpdateParameters>
/asp:ObjectDataSource>
asp:DetailsView ID="SupplierDetails" runat="server" AllowPaging="True"
  AutoGenerateRows="False" DataKeyNames="SupplierID"
  DataSourceID="AllSuppliersDataSource">
  Fields>
    asp:BoundField DataField="CompanyName" HeaderText="Company"
      ReadOnly="True" SortExpression="CompanyName" />
    asp:BoundField DataField="Address" HeaderText="Address"
      SortExpression="Address" />
    asp:BoundField DataField="City" HeaderText="City"
      SortExpression="City" />
    asp:BoundField DataField="Country" HeaderText="Country"
      SortExpression="Country" />
    asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True"
      SortExpression="Phone" />
    asp:CommandField ShowEditButton="True" />
  /Fields>
/asp:DetailsView>

  這時(shí)不管在Suppliers下拉框中選擇什么,DetailsView能夠被分頁(yè)瀏覽,選擇的供應(yīng)商的地址信息也可以被更新。(見(jiàn)圖6)

圖6:任何供應(yīng)商的信息都可以被查看,并且他的地址可以被更新。

第三步:顯示只有被選擇的供應(yīng)商信息

  我們的頁(yè)面此刻不管從Suppliers下拉框中選擇哪個(gè)供應(yīng)商,都能看到所有的供應(yīng)商信息。為了只顯示選擇的供應(yīng)商信息,我們需要添加另外一個(gè)ObjectDataSource到頁(yè)面,用來(lái)獲取一個(gè)特定的供應(yīng)商信息。

  在頁(yè)面上添加一個(gè)新的ObjectDataSource控件,命名為SingleSupplierDataSource。在標(biāo)簽智能標(biāo)簽中,點(diǎn)擊Configure Data Source的鏈接,讓它使用SuppliersBLL類(lèi)的GetSupplierBySupplierID(supplierID)方法。和AllSuppliersDataSource這個(gè)控件一樣,把SingleSupplierDataSource控件的Update()方法指向到SuppliersBLL類(lèi)的UpdateSupplierAdress方法。

圖7:配置SingleSupplierDataSource ObjectDataSource控件并使用GetSupplierBySupplierID(supplierID)方法

  接下來(lái),提示我們需要為GetSupplierBySupplierID(supplierID)方法的supplierID參數(shù)指定參數(shù)來(lái)源。因?yàn)槲覀兿胍獜南吕蜻x擇的供應(yīng)商來(lái)顯示信息,這里我們選擇Suppliers下拉框的SelectedValue屬性作為參數(shù)來(lái)源。

圖8:使用Suppliers下拉框作為supplierID參數(shù)來(lái)源

  即使我們添加了第二個(gè)ObjectDataSource,目前的DetailsView仍然是使用AllSuppliersDataSource這個(gè)ObjectDataSource控件。我們需要添加一些邏輯,根據(jù)選擇不同的Suppliers中的供應(yīng)商來(lái)調(diào)整數(shù)據(jù)源的使用。為了做到這些,可以為Suppliers下拉框添加一個(gè)SelectedIndexChanged事件的處理器??梢酝ㄟ^(guò)最簡(jiǎn)單地在設(shè)計(jì)器中雙擊下拉框完成。這個(gè)事件處理器需要決定使用什么數(shù)據(jù)源,而且需要重新綁定數(shù)據(jù)道DetailsView控件。下面是完成功能的代碼:

protected void Suppliers_SelectedIndexChanged(object sender, EventArgs e)
{
  if (Suppliers.SelectedValue == "-1")
  {
    // The "Show/Edit ALL" option has been selected
    SupplierDetails.DataSourceID = "AllSuppliersDataSource";
    // Reset the page index to show the first record
    SupplierDetails.PageIndex = 0;
  }
  else
    // The user picked a particular supplier
    SupplierDetails.DataSourceID = "SingleSupplierDataSource";
  // Ensure that the DetailsView is in read-only mode
  SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly);
  // Need to "refresh" the DetailsView
  SupplierDetails.DataBind();
}

  這個(gè)事件處理器由是否選擇“顯示/編輯所有的供應(yīng)商“來(lái)觸發(fā)。如果選擇,它會(huì)設(shè)置SupplierDetails這個(gè)DetailsView控件的DataSourceID為AllSuppliersDataSource控件,并且通過(guò)指定PageIndex為0來(lái)使得用戶看到這些供應(yīng)商中的第一條記錄。然而,如果用戶從下拉框選擇了一個(gè)特定的供應(yīng)商,DetailsView的DataSourceID將會(huì)被設(shè)置成SingleSuppliersDataSource。不管使用哪一種數(shù)據(jù)源,SuppliersDetails將會(huì)被設(shè)置成只讀模式,通過(guò)調(diào)用SuppliersDetails控件的DataBind()方法來(lái)重新綁定DetailsView的數(shù)據(jù)。

  通過(guò)這個(gè)事件處理器,DetailsView現(xiàn)在可以顯示選擇的供應(yīng)商信息,除非選擇了“顯示/編輯所有的供應(yīng)商“,那樣所有的供應(yīng)商可以通過(guò)分頁(yè)被瀏覽。圖9顯示了選擇了“顯示/編輯所有的供應(yīng)商“的頁(yè)面,注意分頁(yè)界面的實(shí)現(xiàn),允許用戶訪問(wèn)和更新供應(yīng)商信息。圖10顯示了選擇的Ma Maison供應(yīng)商信息。這種情況下只有Ma Maison的信息是可以被瀏覽和編輯的。

圖9:所有的供應(yīng)商信息可以被瀏覽和編輯

圖10:只有選擇的供應(yīng)商信息才能被瀏覽和編輯

  注意:對(duì)于這個(gè)教程,DropDownList和DetailsView控件的EnableViewState都必須設(shè)置成默認(rèn)的true,這是因?yàn)楦淖僁ropDownList的SelectedIndex和DetailsView的DataSourceID屬性,必須在回傳的時(shí)候被記錄。

第四步:在一個(gè)可編輯的GridView中列出供應(yīng)商信息

  隨著DetailsView的完成,我們下一步要根據(jù)選擇的供應(yīng)商提供一個(gè)可以編輯的GridView。這個(gè)GridView控件應(yīng)該只允許編輯ProductName和QuantityPerUnit屬性。此外,如果用戶是一個(gè)特定的供應(yīng)商,并且訪問(wèn)這個(gè)頁(yè)面,應(yīng)該允許他能夠更新那些可以沒(méi)有過(guò)時(shí)的產(chǎn)品。為了實(shí)現(xiàn)這些我們首先需要給ProductBLL類(lèi)添加一個(gè)重載的UpdateProducts方法,讓它使用ProductID,ProductName,以及QuantityPerUnit作為輸入?yún)?shù)。在前面的教程中我們已經(jīng)做過(guò)類(lèi)似的操作,所以這里我們僅看一下需要添加到ProductsBLL類(lèi)中的代碼:

[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, string quantityPerUnit, int productID)
{
  Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
  if (products.Count == 0)
    // no matching record found, return false
    return false;
  Northwind.ProductsRow product = products[0];
  product.ProductName = productName;
  if (quantityPerUnit == null)
    product.SetQuantityPerUnitNull();
  else
    product.QuantityPerUnit = quantityPerUnit;
  // Update the product record
  int rowsAffected = Adapter.Update(product);
  // Return true if precisely one row was updated, otherwise false
  return rowsAffected == 1;
}

  通過(guò)這個(gè)重載方法,我們可以開(kāi)始添加GridView控件以及相關(guān)的ObjectDataSource控件。添加一個(gè)GridView控件到頁(yè)面上,并且設(shè)置它的ID屬性為ProductBySupplier,然后配置它使用新的名為ProductBySupplierDataSource的ObjectDataSource控件。因?yàn)槲覀兿胪ㄟ^(guò)選擇供應(yīng)商來(lái)使GridView顯示那些產(chǎn)品,我們需要使用ProductBLL類(lèi)的GetProductsBySupplierID(supplierID)方法。同時(shí)需要把剛剛添加的重載方法UpdateProduct映射到ObjectDataSource的Update()方法。

圖11:配置ObjectDataSource使用添加的UpdateProduct重載方法

  接下來(lái)提示要我們?yōu)镚etProductsBySupplierID(supplierID)方法的supplierID輸入?yún)?shù)選擇參數(shù)源。因?yàn)槲覀兿胍贒etailsView中顯示供應(yīng)商的產(chǎn)品信息,我們使用SuppliersDetails這個(gè)DetailsView控件的SelectedValue屬性作為參數(shù)源。

圖12:使用SuppliersDetails DetailsView控件的SelectedValue屬性作為參數(shù)源

  回到GridView中,除去ProductName,QuantityPerUnit,還有Discontinued以外的其他成員,并標(biāo)記Discontinued CheckBoxField為read-only。而且,在GridView的智能標(biāo)簽中勾上Enable Editing這個(gè)選項(xiàng)。做完這些改變之后,GridView和ObjectDataSource聲明標(biāo)記應(yīng)該和下面的相似:

asp:GridView ID="ProductsBySupplier" runat="server" AutoGenerateColumns="False"
  DataKeyNames="ProductID" DataSourceID="ProductsBySupplierDataSource">
  Columns>
    asp:CommandField ShowEditButton="True" />
    asp:BoundField DataField="ProductName" HeaderText="Product"
      SortExpression="ProductName" />
    asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit"
      SortExpression="QuantityPerUnit" />
    asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
      ReadOnly="True" SortExpression="Discontinued" />
  /Columns>
/asp:GridView>
asp:ObjectDataSource ID="ProductsBySupplierDataSource" runat="server"
  OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
  SelectMethod="GetProductsBySupplierID" UpdateMethod="UpdateProduct">
  UpdateParameters>
    asp:Parameter Name="productName" Type="String" />
    asp:Parameter Name="quantityPerUnit" Type="String" />
    asp:Parameter Name="productID" Type="Int32" />
  /UpdateParameters>
  SelectParameters>
    asp:ControlParameter ControlID="SupplierDetails" Name="supplierID"
      PropertyName="SelectedValue" Type="Int32" />
  /SelectParameters>
/asp:ObjectDataSource>

  和前面一個(gè)ObjectDataSource一樣,這個(gè)ObjectDataSource控件的OldValuesParameterFormatString設(shè)置成了original_{0},會(huì)在更新產(chǎn)品名稱(chēng)及其單價(jià)時(shí)候出現(xiàn)問(wèn)題??梢詮穆暶髦谐ミ@個(gè)屬性或者把它的值設(shè)置為默認(rèn)的{0}。在配置完成之后,我們的頁(yè)面現(xiàn)在可以在GridView中顯示被選擇的供應(yīng)商的產(chǎn)品信息(見(jiàn)圖13)?,F(xiàn)在任何一個(gè)產(chǎn)品的名字以及單價(jià)都是可以編輯更新的。然后,我們需要更新代碼邏輯,以確保為指定供應(yīng)商相關(guān)的用戶過(guò)濾那些已經(jīng)廢棄的產(chǎn)品。我們將在第四步的最后實(shí)現(xiàn)它。

圖13:選擇的供應(yīng)商的產(chǎn)品被顯示

  注意:通過(guò)添加可編輯的GridView控件,在Suppliers下拉框的SelectedIndexChanged事件處理器中,我們應(yīng)該更新GridView回到只讀狀態(tài)。否則,如果在編輯一個(gè)產(chǎn)品信息的同時(shí),更換一個(gè)供應(yīng)商,一個(gè)相應(yīng)的GridView的索引將會(huì)保持GridView的可編輯狀態(tài)。為了避免發(fā)生這類(lèi)事情,可以在SelectedIndexChanged事情中很簡(jiǎn)單地設(shè)置GridView的EditIndex屬性為-1。

第五步:當(dāng)“顯示/編輯所有供應(yīng)商”沒(méi)有被選擇時(shí)候,不允許編輯已經(jīng)廢棄的產(chǎn)品

  盡管ProductsBySupplier GridView已經(jīng)功能全面,它當(dāng)前為來(lái)自指定供應(yīng)商的用戶提供了太多的訪問(wèn)權(quán)限。根據(jù)我們的業(yè)務(wù)規(guī)則,用戶不能夠更新廢棄的產(chǎn)品。為了執(zhí)行這些,當(dāng)來(lái)自某個(gè)指定供應(yīng)商的用戶訪問(wèn)這個(gè)頁(yè)面時(shí),我們會(huì)在GridView中這些廢棄的產(chǎn)品前隱藏掉編輯按鈕。

  為GridView的RowDataBound事件新建一個(gè)事件處理器。在事件處理器中我們需要決定用戶是否和某個(gè)供應(yīng)商相關(guān)聯(lián),對(duì)于教程中,我們可以通過(guò)Suppliers這個(gè)下拉框來(lái)決定-如果不是-1,那么用戶就是和當(dāng)前供應(yīng)商關(guān)聯(lián)的。對(duì)于某些用戶,我們需要決定產(chǎn)品是否已經(jīng)廢棄。我們可以通過(guò)e.Row.DataItem屬性來(lái)獲得一個(gè)綁定到GridView上的ProductRow實(shí)例,正如我們?cè)谠贕ridView的頁(yè)腳顯示摘要信息教程中所提及到的。如果產(chǎn)品過(guò)期了,我們可以使用在前面教程-為刪除數(shù)據(jù)添加客戶端確認(rèn)中所討論的技術(shù),在GridView的CommandFild中獲取一個(gè)編輯按鈕的引用,一旦我們獲得這個(gè)引用,我們就可以隱藏或者刪除這個(gè)按鈕。

protected void ProductsBySupplier_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    // Is this a supplier-specific user?
    if (Suppliers.SelectedValue != "-1")
    {
      // Get a reference to the ProductRow
      Northwind.ProductsRow product =
        (Northwind.ProductsRow)((System.Data.DataRowView)e.Row.DataItem).Row;
      // Is this product discontinued?
      if (product.Discontinued)
      {
        // Get a reference to the Edit LinkButton
        LinkButton editButton = (LinkButton)e.Row.Cells[0].Controls[0];
        // Hide the Edit button
        editButton.Visible = false;
      }
    }
  }
}

  在事件處理器中,當(dāng)一個(gè)來(lái)自指定供應(yīng)商的用戶訪問(wèn)這個(gè)頁(yè)面時(shí)候,那些被廢棄的產(chǎn)品將是不可編輯的,因?yàn)檫@些產(chǎn)品的編輯按鈕不再可見(jiàn)。比如,Chef Anton's Gumbo Mix對(duì)于New Orleans Cajun Delights供應(yīng)商來(lái)講是一個(gè)廢棄產(chǎn)品。當(dāng)這個(gè)供應(yīng)商的用戶訪問(wèn)這個(gè)頁(yè)面時(shí)候,這個(gè)產(chǎn)品的編輯按鈕是不可見(jiàn)的(見(jiàn)圖14)。然而,當(dāng)使用“顯示/編輯所有供應(yīng)商”訪問(wèn)頁(yè)面時(shí)候,編輯按鈕是可見(jiàn)的(見(jiàn)圖15)。

圖14:對(duì)于指定供應(yīng)商用戶,Chef Anton's Gumbo Mix的編輯按鈕是被隱藏的

圖15:對(duì)于“顯示/編輯所有供應(yīng)商”用戶,Chef Anton's Gumbo Mix的編輯按鈕是可見(jiàn)的

在業(yè)務(wù)邏輯層中檢查訪問(wèn)權(quán)限

  在這篇教程中,ASP.NET通過(guò)處理邏輯讓用戶可以訪問(wèn)那些信息以及哪些產(chǎn)品他可以更新。概念上來(lái)講,這些邏輯也可以在業(yè)務(wù)邏輯成完成。例如,在SuppliersBLL類(lèi)中的GetSuppliers()方法可以包含一個(gè)檢測(cè),以保證當(dāng)前登錄的用戶不和一個(gè)指定的供應(yīng)商相關(guān)。同樣,UpdateSupplierAddress方法可以添加一個(gè)檢測(cè),確保當(dāng)前登錄用戶既可以是來(lái)自我們公司(因此可以更新所有供應(yīng)商的地址資料),或者跟一個(gè)特定的供應(yīng)商相關(guān),只能更新他的數(shù)據(jù)。在這里我不會(huì)包含任何業(yè)務(wù)邏輯層的檢測(cè)代碼,因?yàn)樵诮坛讨?,用戶的?quán)限由頁(yè)面的下拉框所決定,業(yè)務(wù)邏輯層的類(lèi)代碼是無(wú)法訪問(wèn)到的。當(dāng)使用成員系統(tǒng)或者是ASP.NET提供的一種認(rèn)證模式(比如Windows認(rèn)證),當(dāng)前登錄用戶的信息和角色信息可以通過(guò)業(yè)務(wù)邏輯層訪問(wèn)到,因此在那種情況下在表現(xiàn)層和業(yè)務(wù)層都能夠進(jìn)行權(quán)限判斷。

總結(jié)

  大部分提供帳號(hào)的站點(diǎn)需要根據(jù)登錄用戶而定制不同的數(shù)據(jù)修改界面。管理員或許能夠刪除或編輯任何記錄,沒(méi)有管理權(quán)限的用戶可能被限制只能更新或刪除他們自己創(chuàng)建的數(shù)據(jù)。無(wú)論是哪類(lèi)情況,數(shù)據(jù)web控件,ObjectDataSource,以及業(yè)務(wù)邏輯層的類(lèi)可以用來(lái)擴(kuò)展成基于登錄用戶的添加刪除功能。在這篇教程中,我們看到了如果根據(jù)用戶是否和某個(gè)供應(yīng)商相關(guān)聯(lián),或者是為我們公司一員來(lái)限制顯示和編輯數(shù)據(jù)。

  這篇教程總結(jié)了使用GridView,DetailsView,以及FormView控件來(lái)添加,更新,刪除數(shù)據(jù)。從下一篇開(kāi)始,我們將關(guān)注添加分頁(yè)和排序的功能支持。

祝編程愉快!

作者簡(jiǎn)介

Scott Mitchell,著有六本ASP/ASP.NET方面的書(shū),是4GuysFromRolla.com的創(chuàng)始人,自1998年以來(lái)一直應(yīng)用 微軟Web技術(shù)。Scott是個(gè)獨(dú)立的技術(shù)咨詢顧問(wèn),培訓(xùn)師,作家,最近完成了將由Sams出版社出版的新作,24小時(shí)內(nèi)精通ASP.NET 2.0。他的聯(lián)系電郵為mitchell@4guysfromrolla.com,也可以通過(guò)他的博客http://ScottOnWriting.NET與他聯(lián)系。

您可能感興趣的文章:
  • asp.net下linkbutton的前后臺(tái)使用方法
  • asp.net button 綁定多個(gè)參數(shù)
  • 關(guān)于asp.net button按鈕的OnClick和OnClientClick事件
  • js觸發(fā)asp.net的Button的Onclick事件應(yīng)用
  • ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二十四:分頁(yè)和排序報(bào)表數(shù)據(jù)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二十五:大數(shù)據(jù)量時(shí)提高分頁(yè)的效率
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二十六:排序自定義分頁(yè)數(shù)據(jù)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二十七:創(chuàng)建自定義排序用戶界面
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二十八:GridView里的Button

標(biāo)簽:慶陽(yáng) 中衛(wèi) 清遠(yuǎn) 臨夏 海西 聊城 甘肅

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對(duì)修改數(shù)據(jù)進(jìn)行限制》,本文關(guān)鍵詞  在,ASP.NET,2.0,中,操作,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對(duì)修改數(shù)據(jù)進(jìn)行限制》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對(duì)修改數(shù)據(jù)進(jìn)行限制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲精品午夜av福利久久蜜桃| 国产免费黄色小视频| 人人干在线观看| 麻豆视频在线免费看| 麻豆视频官网| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲一区二区高清视频| www99avcom| 亚洲欧美小说国产图片| 日韩视频在线观看一区二区三区| 国产美女无遮挡网站| 国产精品suv一区二区88| 成人影视亚洲图片在线| 国产在线精品播放| 欧美猛男gaygay网站| 亚洲综合久久久久| 福利在线一区| 香蕉视频免费在线看| 欧美午夜精品电影| 一区二区三区高清视频在线观看| 欧美黑人极品猛少妇色xxxxx| 唐人社导航福利精品| 色老太综合网| av欧美精品.com| 久久综合色一综合色88| 日本在线免费播放| 一二三区在线观看| 欧洲亚洲视频| 日本精品一区二区在线观看| 亚洲成av人影院在线观看| 欧美有码在线观看视频| 久久久久亚洲av片无码v| 欧美一区二区三区久久综| 中文字幕日本不卡| 日本欧美亚洲| 一区二区三区欧美成人| 国产精品一区二区精品视频观看| 中文字幕一区在线观看视频| 成人bbav| 亚洲综合在线中文字幕| 欧美日韩综合精品| 欧美性视频在线| 午夜电影福利网| av伊人久久| 波多野结衣中文在线| 在线不卡av电影| 国产亚洲高清一区| 中文字幕丰满孑伦无码专区| 成人欧美一区二区三区小说| 亚洲激情av在线| 欧美另类videos死尸| h文在线观看免费| 日韩字幕在线观看| 国内精品中文字幕| 正在播放国产一区| 91精彩在线视频| 亚洲欧美日韩在线高清直播| 国产精品美女诱惑| 国产成人77亚洲精品www| 欧美特级限制片免费在线观看| 9色视频在线观看| 欧美贵妇videos办公室| 亚洲国产成人va在线观看天堂| 国产一区二区三区中文字幕| 91在线视频导航| 精品中文av资源站在线观看| 国产精品日韩一区二区| 色综合狠狠操| 日本三级在线电影| 国产调教一区二区三区| 日韩午夜视频在线观看| 亚洲资源网你懂的| 国产精品久久久久久亚洲调教| 欧美午夜影院一区| 亚洲av无码乱码国产精品| 午夜影视日本亚洲欧洲精品| 亚洲男人电影天堂| 免费无遮挡无码永久视频| av网站免费在线观看| 成人av网站观看| 天堂а在线中文在线无限看推荐| 国产绳艺sm调教室论坛| 久久午夜羞羞影院免费观看| h视频免费网站| 国产宾馆实践打屁股91| 免费看av大片| 国产福利91精品一区二区| 久久综合色一本| 91麻豆一区二区| 国产美女免费观看| 亚洲毛茸茸少妇高潮呻吟| 中文字幕av一区中文字幕天堂| 国产在线观看一区| 潘金莲一级淫片aaaaaaa| 亚洲自拍偷拍欧美| 免费黄色欧美视频| 国模吧一区二区| 国产精品午夜视频| 日韩片之四级片| 欧美性free免费| 国产福利免费在线观看| 日韩成人一区二区三区在线观看| 国产福利av网站| 亚洲2020天天堂在线观看| 国产精品久久久久白浆| 青娱乐一区二区| 男女视频在线观看网站| 视频在线你懂的| 欧美另类变人与禽xxxxx| 亚洲国产综合91精品麻豆| 国内精品美女在线观看| 在线精品视频在线观看高清| 精品三级av在线导航| 欧美性videosxxxxx| 国产一区二区三区无遮挡| 一区二区三区在线观看www| 91精品久久久久久久| 国产又大又黄的视频| videos性欧美另类高清| 狠狠色噜噜狠狠狠888奇米| 日韩性小视频| 亚洲精品久久久久久久久久久| 国产精品成人网站| 久久夜色精品国产噜噜亚洲av| 中文一区一区三区高中清不卡| 粗大的内捧猛烈进出在线视频| 中文字幕av在线一区二区三区| 亚洲综合在线视频| 自拍亚洲一区| 中文字幕亚洲一区二区三区| 石原莉奈一区二区三区高清在线| 一女二男一黄一片| 欧美巨大xxxx| 天堂资源最新版在线视频观看免费网| 日韩av自拍偷拍| 国产情侣免费视频| 国产一级生活片| 最近中文字幕免费mv2018在线| 91麻豆国产福利在线观看| 国产精品第1页| 波多野结衣欲乱| 99精品国产99久久久久久97| 偷偷www综合久久久久久久| 国产精品一区免费在线| 日本道精品一区二区三区| 欧美一级一片| 免费污网站在线观看| 欧美性猛交xxxx乱大交hd| 亚洲成人一二三区| 中文字幕一区二区人妻痴汉电车| 九九热精品在线播放| gogo亚洲国模私拍人体| 亚洲精品在线免费看| 日韩av不卡播放| 亚洲乱码一区二区三区三上悠亚| 麻豆网址在线观看| 好吊色在线观看| 日本成a人片在线观看| 69精品视频| 国产精品一区二区三区四区五区| 亚洲精华一区二区三区| 樱桃视频在线观看一区| 三级av在线播放| 久操视频在线播放| 草视频在线观看| 九九热播视频在线精品6| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 超碰97在线看| 亚洲图色中文字幕| 亚洲精品一区二区三区区别| 日韩在线电影| 国产欧美在线观看免费| 欧美成人精品一区| 在线观看不卡| 日本19禁啪啪吃奶大尺度| 亚洲国产成人午夜在线一区| 国产一级片免费| 高清一区二区| 无码任你躁久久久久久久| 一级片avav网址| 四虎影视成人永久免费观看视频| 日韩视频在线免费看| 在线观看你懂得| 亚洲免费一区三区| 美女黄色片视频| 亚洲一级片免费观看| 国产裸体舞一区二区三区| 在线播放亚洲| 国产精品x8x8一区二区| 日韩av综合网站| 成人综合婷婷国产精品久久蜜臀| 欧美日韩一区二区不卡| 四虎影院在线免费播放| 一区二区久久久久| 欧美一级网址| 最新天堂资源在线资源| 国产精品熟妇一区二区三区四区| 天堂成人在线| 色视频www在线播放国产| av成人午夜| 在线国产伦理一区| av福利导福航大全在线播放| 久青青在线观看视频国产| 国产精品天天av精麻传媒| 狠狠色丁香婷综合久久| 久热成人在线视频| 天天干视频在线观看| 国产网友自拍视频| 欧美四级电影网| 精品99在线观看| 亚洲欧美电影院| 午夜免费精品视频| 欧美成人高清手机在线视频| 精品国产精品国产偷麻豆| 国产九九精品| 激情小说 在线视频| 性xx十八spa按摩| 国产高潮在线观看| 99久久久无码国产精品性| 国产精品无码一区二区三区| 日韩一级视频免费观看在线| 国产亚洲成av人片在线观黄桃| 能看的毛片网站| 未来日记在线观看| 99久久国产综合精品五月天喷水| 午夜视频一区二区三区| 亚洲福利天堂| 日韩中文字幕在线免费观看| 亚洲国产一区自拍| 我看黄色一级片| 亚洲一区二区精品在线| 中出福利视频| 欧美肥老太太性生活| 欧美日韩伦理| 影音成人av| 欧美寡妇性猛交xxx免费| 成人午夜淫片100集| 日本在线视频中文有码| 国产一区二区高清| 熟妇人妻无乱码中文字幕真矢织江| 亚洲精品第1页| av在线免费在线观看| 国产一区视频免费观看| 国产99在线 | 亚洲| 欧美日韩综合久久| 在线免费观看一区二区| 欧美video巨大粗暴18| 好看的av网站| 亚洲日本久久久午夜精品| 中文天堂最新版本在线观看| 国产高清亚洲| 丁香网亚洲国际| 国产成人超碰人人澡人人澡| 91视频久久| 国产精品1区2区3区4区| 草莓视频一区二区三区| 18成人免费观看视频漫画| 中文字幕av久久爽av| 欧美日韩在线观看一区二区三区| 国内精品视频在线观看| 欧美调教sm| 永久免费精品视频| 欧美中文字幕精品| 麻豆久久久久| 98色花堂精品视频在线观看| 成人亚洲欧美激情在线电影| 日韩欧美国产黄色| 国产九九在线| 三上悠亚作品在线观看| 国产日韩换脸av一区在线观看| 欧美精品三区| 成人午夜sm精品久久久久久久| 日日操免费视频| 青青青爽在线视频免费观看| 99精品国产一区二区| 亚洲精品888| 中文在线观看免费网站| 91p0rn永久地址| 欧美激情综合色综合啪啪五月| 亚洲精品综合网| 成人做爰www看视频软件| 老熟妇仑乱视频一区二区| 精品人妻人人做人人爽夜夜爽| 国产大学生视频| 欧美日韩久久久久| 一本色道久久88亚洲精品综合| 亚洲欧美国产精品专区久久| 在线中文字日产幕| 日韩免费观看在线观看| 91手机在线播放| 中文字幕在线播放第一页| 一级片在线观看视频| 亚洲无线观看| 免费日韩视频在线观看| 夜夜爽av福利精品导航| 亚洲色图偷拍自拍| 国产福利免费视频| 免费福利片在线观看| 麻豆导航在线观看| 91欧美精品成人综合在线观看| 国产一区二区三区在线播放免费观看| 亚洲天堂1区| 成人在线观看视频网站| 亚州综合一区| 欧美变态另类刺激| 韩国主播福利视频一区二区三区| 国产第一页在线播放| 精品久久久久久电影| 国产日韩影视精品| 国产农村妇女毛片精品久久| 日韩成人激情视频| 国产精品专区免费| 国产欧美精品日韩| 日本不卡一区二区三区高清视频| 国产成人一区二区三区| 国产剧情日韩欧美| 国产成人精品综合久久久| 日韩电影毛片| 老司机午夜精品视频在线观看| 又黄又骚的视频| 欧美性极品少妇| 亚洲国产午夜伦理片大全在线观看网站| 最近2018年中文字幕在线| 欧美在线制服丝袜| 亚洲激情中文字幕| 欧美成人午夜激情视频| 免费污视频在线观看| 777久久久精品|