1

GridViewによってサポートされているビューの 1 つにコントロールを追加したいと考えていますSqlDataSourceSelectCommandクエリは、現在ログインしているユーザーの GUID でパラメーター化されているためaspnet_Users.UserId、ユーザー ID をパラメーターとして渡す方法が必要です。

コード ビハインドなしで SqlParameter で ASP.NET の現在のユーザー名を利用する方法を読み、次のParameter名前のカスタムを作成することにしましたUserIdParameter

namespace MyApp.Web
{
    public class UserIdParameter : Parameter
    {
        public UserIdParameter(string name)
            : base(name)
        {
        }

        protected UserIdParameter(UserIdParameter parameter)
            : base(parameter)
        {
        }

        protected override Parameter Clone()
        {
            return new UserIdParameter(this);
        }

        protected override object Evaluate(HttpContext context, Control control)
        {
            return Membership.GetUser().ProviderUserKey;
        }
    }
}

ASPX ビューで、次のように追加しました。

<%@ Register TagPrefix="my" Namespace="MyApp.Web" %>

行の次の<%@ Page ... %>行と同様に:

    <SelectParameters>
        <my:UserIdParameter Name="UserId" />
    </SelectParameters>

要素内asp:SqlDataSource

残念ながら、パーサー エラー (「このリクエストを処理するために必要なリソースの解析中にエラーが発生しました。次の特定の解析エラーの詳細を確認し、ソース ファイルを適切に変更してください。」) が表示され、次の部分が赤色で強調表示されます。

        <my:UserIdParameter Name="UserId" />

Visual Web Developer 2010 Express からも、「要素 'UserIdParameter' は既知の要素ではありません。これは、Web サイトにコンパイル エラーがあるか、web.config ファイルが見つからない場合に発生する可能性があります。」と通知されます。

Web.config何らかの方法で変更する必要がありますか? UserIdParameterそうでない場合、カスタムパラメータを使用するにはどうすればよいですか?

4

3 に答える 3

2

私は問題を理解しました。カスタムUserIdParameterクラスは別のアセンブリにある必要があり、引数のないコンストラクターが必要でした。

私のために働いた手順は次のとおりです。

  1. 新しい ASP.NET サーバー コントロール プロジェクトを作成し、現在のソリューションに追加します。(この新しいプロジェクトに MyApp.Web.UI.WebControls という名前を付けました)。
  2. 次のクラスを追加します。

    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace MyApp.Web.UI.WebControls
    {
        public class UserIdParameter : Parameter
        {
            public UserIdParameter()
            {
            }
    
            public UserIdParameter(UserIdParameter userIdParameter)
                : base(userIdParameter)
            {
            }
    
            protected override Parameter Clone()
            {
                return new UserIdParameter(this);
            }
    
            protected override object Evaluate(HttpContext context, Control control)
            {
                return Membership.GetUser().ProviderUserKey;
            }
        }
    }
    
  3. MyApp.Web.UI.WebControls アセンブリをビルドします。ASP.NET Web プロジェクト (私の場合は MyApp.Web という名前) から参照してください。

  4. に追加Web.config:

    <pages>
          <controls>
            <add tagPrefix="my" assembly="MyApp.Web.UI.WebControls" namespace="MyApp.Web.UI.WebControls"/>
          </controls>
          <!-- ... -->
    </pages>
    

    これにより、コントロール ライブラリがサイト全体に登録されます。pages(要素は要素内にあることに注意してくださいsystem.web。)

  5. SelectParametersの要素で次を使用しますSqlDataSource

    <my:UserIdParameter Name="UserGuid" DbType="Guid" />
    

    ( は必要ありません<%@ Register ... %>)

于 2011-01-18T18:49:06.153 に答える
0

より簡単な方法は、「選択」イベントを使用することです。ここで、カスタム パラメータを追加できます。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.selecting.aspx

于 2012-05-04T13:31:49.603 に答える
0

クエリのパラメーターで SQLDataSource を使用しなかったのはなぜですか? その後、パラメーター @UserId がセッション変数と等しいことを SQLDataSource に伝えることができると確信しています。1 つのコード行なしですべてのこと。すべてグラフィカル インターフェイスで。

于 2011-01-17T18:17:30.023 に答える