Предложение ASP.NET LinqDataSource WHERE - PullRequest
2 голосов
/ 18 декабря 2009

Мне нужно сделать предложение 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?

1 Ответ

1 голос
/ 22 декабря 2009

Код, который вы разместили, на самом деле является совершенно приемлемым подходом. Если вам понадобится делать это часто, вы можете наследовать от класса 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 и т. Д.

...