0

Web アプリケーションではなくASP.NET Websiteがあり、CompareValidator独自の名前付けコンテナーの外に出ることができるカスタムを構築しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;

public class GlobalCompareValidator : CompareValidator
{
    new protected void CheckControlValidationProperty(string name, string propertyName)
    {
        Control control = this.Page.NamingContainer.FindControl(name);
        if (control == null)
        {
            throw new HttpException("Validator_control_not_found");
        }
        if (BaseValidator.GetValidationProperty(control) == null)
        {
            throw new HttpException("Validator_bad_control_type");
        }
    }
}

そのコードはApp_Codeディレクトリに存在します。今、この新しいカスタム コントロールを ASCX ページで次のように使用したいと考えています。

<me:GlobalCompareValidator ID="compareValidator" CssClass="errorMessage" Display="None"
    EnableClientScript="false" Text="&nbsp;" ValidationGroup="LHError" runat="server" />

ただし、アセンブリを使用するために登録しようとすると、次のようになります。

<%@ Register TagPrefix="me" Namespace="MyNamespace" Assembly="MyAssembly" %>

次のエラーが表示されます。

ファイルまたはアセンブリ '...' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

ASP.NET Web サイトは実際にはそのようなアセンブリを生成しないため、これはそれほど驚くべきことではありません。ただし、Assemblyタグを外したままにすると、見つかりませんGlobalCompareValidator。確かに、Assemblyタグでも見つからない可能性がありますが、そのエラーは、アセンブリが見つからないという事実によって隠されている可能性があります。

ASP.NET Web サイトで使用できるカスタム コントロールを取得するにはどうすればよいでしょうか。

4

2 に答える 2

1

さて、この問題の解決策は複雑ですが、ここまでです。まず、カスタム コントロールを機能させるためにかなりの時間を費やした後、問題に対する考え方を変えることにしました。私は言った:

代わりに、適切な名前付けコンテナーでコントロールを取得できたらどうでしょうか?

十分に簡単に思えます!実行時に、ユーザー コントロールからコントロールを削除し、ユーザー コントロールの親に追加します。しかし、それは見た目よりもはるかに複雑です。またはでControlsコレクションを変更するため、アイデアには少し問題があります。しかし、残念ながら、スタック オーバーフローがここでの回答を介して救助に来ました。そのため、次のコードをユーザー コントロールに追加しました。InitLoad

protected void Page_Init(object sender, EventArgs e)
{
    this.Page.Init += PageInit;
}

protected void PageInit(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(this.ControlToCompare))
    {
        this.Controls.Remove(this.compareValidator);
        this.Parent.Controls.Add(this.compareValidator);
    }
}

ここにあるのは、ページのライフ サイクルの小さな抜け穴です。またはでControlsコレクションを変更することはできませんが、これら 2 つのイベントの間に変更することはできます。ありがとうティム!InitLoad

CompareValidatorこれにより、実行時に適切な名前付けコンテナーに移動して、検証対象のユーザー コントロールを見つけることができるという点で、タスクが達成されます。

注:ValidationProperty値を比較するユーザー コントロールに属性を追加する必要もあります。私はこのようにしました:

[ValidationProperty("Value")]

そしてもちろんValue、そのユーザー コントロールで公開されているという名前のプロパティがあります。CompareValidator私の場合、同じユーザー コントロールの 2 つの値を比較していたため、その属性は、変更していたのと同じユーザー コントロールに適用されました。

これが誰かに役立つことを願っています!

于 2013-05-28T20:18:44.407 に答える
1

Register ディレクティブは、次の 2 つの目的で使用できます。

  1. UserControl を含める
  2. カスタム コントロールを含める

SRC 属性は、UserControl を含める場合にのみ必要です。あなたの場合、カスタム コントロールを使用しているので、名前空間とアセンブリ属性のみが必要です。

詳細については、この MSDN ページを確認してください。

http://msdn.microsoft.com/en-us/library/c76dd5k1(v=vs.71).aspx

于 2013-05-28T13:20:20.787 に答える