2

LinqDataSource現在ログインしているユーザーに応じて、WHERE句を作成する必要があります。もちろん、コードビハインドで現在ログインしているユーザーにアクセスできます。特に、データベースからユーザーに属するデータのみをフェッチするには、ユーザーIDが必要です。

Whereタグに属性を追加すると正常に機能します<asp:LinqDataSource />が、サーバーコントロールにタグを含めることができないため、データソースに接続されているGridViewをデータバインディングする前に、コードビハインドで属性<% %>を設定しようとしました。WhereOnLoad

ただし、コードビハインドで属性を設定しても効果がないようです。コードで手動(および静的)に指定すると正常に機能しますascxが、コードビハインドからは機能しません。

私は間違った順序で、または間違った時間に物事をしていると推測しています。どうすればよいですか?

アップデート:

このハックを思いついた。のダミーラベルを使用して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をプログラムする方法ですか?

4

1 に答える 1

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 などもあります。

于 2009-12-22T19:39:55.433 に答える