0

私のサーバー コントロールでは、次のようなマークアップを使用していくつかのプロパティを設定する必要があります。

<cc:MyControl runat="server" Property="Required" />

開発者がプロ​​パティの追加を忘れると、例外がスローされます。これは、パブリック プロパティのゲッターで発生します。

public string Property
{
  get { return GetRequiredPropertyFromViewState["Property"]; }
  set { ViewState["Property"] = value; }
}

YSOD で、ソース エラーとスタック トレースが表示されます。表示されるソースは、私のカスタム コントロール クラスのものです。

Line 173:   throw new ArgumentException(message);

コントロールのマークアップをソースエラーとして表示したいです。それは可能ですか?

私が知っているのは、WebForms ページ パーサーが、ソース エラーにマークアップを含む解析エラーを表示する場合があることだけです。しかし、これらは実際には例外ではありません。

編集:私は間違っていました。HttpParseExceptionを使用して、解析エラーをスローできます。ただし、ファイル、ソースコード、および行番号を指定しています。カスタム コントロール内からそれらを提供できるかどうかはわかりません。次の 3 つが必要ですが、最後の 2 つを取得する方法がわかりません。

  1. virtualPath: Page.Request.AppRelativeCurrentExecutionFilePath から取得できます
  2. ソース:
  3. ライン:
4

1 に答える 1

0

コントロール自体からこれを行うことはできないことがわかりました。これは、いったん初期化されると、パーサー インフラストラクチャに戻ることができないためです。

ただし、コントロール ビルダー クラスをサーバー コントロールに関連付けることはできます。このクラスは、ページの解析に参加します。Init メソッドからエラー メッセージだけをスローするHttpParserExceptionと、コントロール マークアップのコードと行がフレームワークによって追加されます。

データ注釈に基づいて必要なプロパティを検証するために、このメソッドを思いつきました。

private void ValidateAttribute(PropertyInfo attribute, object value)
{
  // Reflect all the data annotations' validator attributes on the control property...
  object[] validators = attribute.GetCustomAttributes(typeof(ValidationAttribute), false);

  // ...and validate each one
  foreach (ValidationAttribute validator in validators)
  {
    try
    {
      validator.Validate(value, attribute.Name);
    }
    catch (ValidationException exception)
    {
      // Show as parser error in browser
      throw new HttpParseException(exception.Message);
    }
  }
}

から呼び出して、ControlBuilder.Init()を使用してコントロール ビルダーをサーバー コントロールに関連付けますControlBuilderAttribute

于 2012-08-03T08:07:59.973 に答える