質問

GridView を含むユーザー コントロールがあります。GridView には、HyperLinkField 列と、HyperLink コントロールを含むテンプレート列の両方があります。

ASP.NET プロジェクトは次のように構造化されており、いずれの場合もユーザー コントロールを使用する Default.aspx ページがあります。

  • アプリケーションルート
    • コントロール
      • GridView を使用した UserControl
    • システム管理者フォルダー
      • デフォルト.aspx
      • Edit.aspx
    • 組織管理者フォルダー
      • デフォルト.aspx
      • Edit.aspx
    • 標準ユーザーフォルダー
      • デフォルト.aspx
      • Edit.aspx

注記:フォルダーは、ユーザーが正しい役割を持っていることを確認するために使用されます。

対応するフォルダー内の Edit.aspx ページに解決されるように、HyperLinkField の DataNavigateUrlFormatString と HyperLink の NavigateUrl を設定できる必要があります。

Navigate URLを「edit.aspx」に設定すると、ブラウザのURLが表示されます。http://アプリケーション 元のディレクトリに関係なく、Root/Controls/Edit.aspx'。

パスはアプリケーション ルートではなく現在のページからの相対パスである必要があるため、Web アプリケーション ルート演算子 (~/) は使用できません。

複数のフォルダーで同じユーザー コントロールを使用し、同じフォルダー内の別のページへの URL を解決するにはどうすればよいですか?

注記:この質問は、次の同様の質問に強く基づいています。 asp.net フォーラムの azhar2000s それは私の問題と一致します。

役に立ちましたか?

解決

この質問を入力しているときに、考えられる解決策の 1 つを見つけ、@Thomas からのフィードバックを使用してこれをさらに修正しました。

変化 Control.AppRelativeTemplateSourceDirectory コントロールによって生成される相対パスを変更します。に設定しました ルート相対仮想パス 現在のリクエストフォルダーの場合。UserControl 内の相対パスは、ユーザー コントロールのパスではなく、要求されたページを基準とするようになりました。

//Page Load Event for the User Control
protected void Page_Load(object sender, EventArgs e)
{
    string rootPath = HttpContext.Current.Request.ApplicationPath;
    if (!rootPath.EndsWith("/"))
    {
        rootPath += "/";
    }

    Uri requestUri = HttpContext.Current.Request.Url;
    string folderPath = requestUri.AbsolutePath.Remove(0, rootPath.Length);
    string lastSegment = requestUri.Segments[requestUri.Segments.Length - 1];
    folderPath = folderPath.Remove(folderPath.LastIndexOf(lastSegment));

    AppRelativeTemplateSourceDirectory = "~/" + folderPath;
}

他のヒント

次のようにグリッドまたはページの Load イベントに設定します。

var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn;
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}";

この構造は、URL が行ごとに異なる必要があることを前提としています。 DataNavigateUrlField. 。すべての行で同じ URL にする必要がある場合は、 NavigateUrl ロード時のプロパティ。明らかに、ユーザーの役割に基づいて別のフォルダーを設定します。

追加 コメントで問題について言及したことを考えると、ロールとフォルダーの関係をどこかに保存することをお勧めします。いくつかの選択肢があります。

  1. 魔法のような名前のキーを appSettings (Role_SystemAdministrators、Role_OrganizationAdministrators など) に、それらの宛先フォルダーの名前とともに保存するだけです。このアプローチの利点は、シンプルであることです。欠点は、データを適切に入力する必要があること、ロールを 2 つのフォルダーに誤ってマッピングすることを防ぐものが何もないこと、ロールを追加するときにもう 1 か所で更新する必要があることです。

  2. カスタム ConfigSection を作成して関係を保存します。利点は、各ロールが 1 回だけリストされるようにできることです。欠点は、追加のコードを作成する必要があり、ロールを追加するときに別の場所に何かを追加する必要があることです。

  3. 読む location 設定ファイルからタグを削除します。利点は、複数の場所に値を書き込む必要がなくなることです。欠点は、これを行うのが面倒なことです。現在のユーザーにアクセス許可が与えられている、指定されたフォルダーに関連付けられている最初のタグを見つける必要があります。

  4. データベースから値を読み取ります。値を更新するための管理画面を簡単に記述できるのがメリットです。欠点は、ロールを追加するときに、アプリケーションのまったく別の場所に何かを追加する必要があることです。

現在と同様にフォルダーのアクセス許可を設定します。ただし、この関係を保存すると、カスタム フォーク コードを作成しなくても、その人を適切なフォルダーにリダイレクトできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top