2009-12-18 66 views
2

我需要爲我的LinqDataSource創建一個WHERE子句,這取決於當前登錄的用戶。當然,我可以在代碼隱藏中訪問當前登錄的用戶,我特別需要用戶ID從數據庫中僅提取屬於他/她的數據。ASP.NET LinqDataSource WHERE子句

它正常工作時,我的Where屬性添加到<asp:LinqDataSource />標籤,但因爲服務器控件不能在他們<% %>標籤,我試圖在代碼中設置隱藏的Where屬性,在OnLoad,之前數據綁定在GridView它連接到我的數據源。

但是,在代碼隱藏中設置屬性時,它似乎沒有效果。當我在ascx代碼中手動(和靜態)指定它時,它工作正常,但不是來自代碼隱藏。

我猜我正在做錯誤的順序或錯誤的時間。我該怎麼做呢?

UPDATE:

想出了這個黑客。我使用虛擬標籤lblViewedUserIDVisible="false"來獲取可以從中提取用戶ID的控件。在數據綁定之前,我從代碼隱藏中設置此標籤的文本。

我還添加了<WhereParameters><asp:ControlParameter />與一堆屬性。

<asp:LinqDataSource ID="dsLinqSource" AutoPage="true" AutoSort="true" 
    ContextTypeName="Ortrac.Common.Dbml.OrComDataContext" 
    EnableDelete="false" TableName="myTableName" EnableInsert="false" 
    EnableUpdate="false" runat="server" Select="new(Edited, Activity)" 
    Where="TheUserID.ToString().Equals(@ViewedUserID)"><%-- HACK! --%> 
    <WhereParameters> 
    <asp:ControlParameter Name="ViewedUserID" ControlID="lblViewedUserID" 
          Type="String" PropertyName="Text" /> 
    </WhereParameters> 
</asp:LinqDataSource> 

<%-- Dummy label --%> 
<asp:Label runat="server" ID="lblViewedUserID" Visible="false" /> 

這是真的如何編程ASP.NET嗎?

+0

你的方法爲我節省了大量的時間,謝謝! – 2016-07-04 11:52:26

回答

1

您發佈的代碼實際上是一種完全可以接受的方法。如果您需要經常這樣做,您可以從Parameter類繼承來創建您自己的自定義參數。這就是我們使用:

public class CurrentUserIdParameter : System.Web.UI.WebControls.Parameter 
{ 

    protected override int Evaluate(System.Web.HttpContext context, System.Web.UI.Control control) 
    { 
     if (Contact.Current == null) { 
      return -1; 
     } 
     else { 
      return Contact.Current.ContactID; 
     } 
    } 
} 

這在許多情況下效果很好 - 我們也有一個CurrentLanguageIdParameter,CurrentInstanceIdParameter等