2009-12-18 73 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等