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引发解析错误。但是您已经指定了文件、源代码和行号。我不知道我是否可以从我的自定义控件中提供这些。我需要这三个,其中我不知道如何获得最后两个:

  1. virtualPath:我可以从 Page.Request.AppRelativeCurrentExecutionFilePath 获得
  2. 资源:
  3. 线:
4

1 回答 1

0

我发现您不能从控件本身执行此操作,因为一旦它被初始化,它就无法返回解析器基础结构。

但是您可以将控件生成器类与您的服务器控件相关联。该类参与页面的解析。如果您HttpParserException仅从 Init 方法抛出错误消息,则框架会添加代码和控件标记的行。

我想出了这个方法来验证基于数据注释所需的属性:

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 回答