Мне нужно сделать предложение WHERE для моего LinqDataSource
, которое зависит от текущего пользователя, вошедшего в систему. Конечно, у меня есть доступ к вошедшему в данный момент пользователю в выделенном коде, и мне особенно нужен идентификатор пользователя для выборки только данных, принадлежащих ему / ей, из базы данных.
Работает нормально, когда я добавляю атрибут Where
к тегу <asp:LinqDataSource />
, но поскольку серверные элементы управления не могут содержать теги <% %>
, я попытался установить атрибут Where
в коде позади, в OnLoad
, до привязки данных GridView, который подключен к моему источнику данных.
Однако при настройке атрибута в выделенном фрагменте кода он, похоже, не действует. Он отлично работает, когда я указываю его вручную (и статически) в коде ascx
, но не из кода.
Я предполагаю, что делаю вещи в неправильном порядке или в неправильное время. Как мне это сделать?
UPDATE:
Придумал этот хак. Я использую фиктивную метку lblViewedUserID
с Visible="false"
, чтобы получить элемент управления, из которого я могу извлечь идентификатор пользователя. Я установил текст этой метки из кода перед привязкой данных.
Я также добавил <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?