我需要为我的LinqDataSource
创建一个WHERE子句,这取决于当前登录的用户。当然,我可以访问代码隐藏中当前登录的用户,我特别需要用户ID来从数据库中仅获取属于他/她的数据。
我将Where
属性添加到<asp:LinqDataSource />
标记时工作正常但由于服务器控件中不能包含<% %>
个标记,我尝试设置Where
属性在代码隐藏中,在OnLoad
中,在数据绑定连接到我的数据源的GridView之前。
但是,在代码隐藏中设置属性时,它似乎没有任何效果。当我在ascx
代码中手动(和静态)指定它时,它可以正常工作,但不能从代码隐藏中指定。
我猜我在错误的时间或错误的时间做事。我该怎么做?
更新
想出了这个黑客。我使用带有lblViewedUserID
的虚拟标签Visible="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 :(得分: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等。