2

我需要在页面(或控件)顶部显示格式良好的错误消息。

因此我实现了一个新创建的服务器控件的渲染方法。新创建的控件继承自 ValidationSummary。

public class AgValidationSummary : ValidationSummary
{
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        if(this.Enabled)
        {
            if (Page.IsPostBack && !Page.IsValid)
            {

我现在的问题是,如果一个按钮被触发并且他的属性 CausesValidation 设置为 false 我的验证摘要将抛出一个异常,因为我询问 Page.IsValid 属性(并且只有在调用 Page.validate( )。

有人解决这个问题吗?

4

3 回答 3

3

解决方案很简单:
只是不要解析Page.IsValid标志:)而是在你的void Render(HtmlTextWriter writer)

if (!this.Enabled)
{
    return;
}

if (this.Page != null)
{
    this.Page.VerifyRenderingInServerForm(this);
}
else
{
    return;
}

var failedValidators = this.Page.Validators.OfType<BaseValidator>().Where(bv => string.Equals(bv.ValidationGroup, this.ValidationGroup) && !bv.IsValid).ToList();

if (failedValidators.Any())
{
    writer.Write(this.HeaderText);
    foreach (var failedValidator in failedValidators)
    {
        writer.Write(failedValidator.ErrorMessage);
    }
}

这样做的原因:
导致回发的控件已经获得了关于

  1. 原因验证
  2. 验证组
  3. 和其他东西

因此 ASP.net 引擎本身将执行相关的验证器并将它们设置为IsValid或不设置。

编辑
摆脱原始的 HeaderText (仍然呈现):

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    // overwrite to hide the original HeaderText
}
于 2009-06-12T05:24:03.747 回答
0

也许您可以将 IsValid 属性保存在 ViewState 中,并将其初始化为 true。

在 Load 中,检查 IsValid 是否为 null,如果不为 null,请将 ViewState 中的 IsValid 设置为 Page.IsValid 中的值。

在 Render 中,从 ViewState 中读取 IsValid。

于 2009-03-24T08:19:40.117 回答
0

我可能在这里偏离了轨道,但你不能在控件的构造函数中连接到页面的 Validate 事件吗?

如果需要,您可以有一个内部标志,渲染器会检查该标志是否要执行渲染代码中接下来发生的任何事情。

private bool _thePageIsBeingValidated = false;

public bool ShouldIDoMyThing
{
     get{ return (_thePageIsBeingValidated && this.Enabled && this.Page.IsPostback && this.Page.IsValid != null && this.Page.IsValid == false); }
}
于 2009-03-24T11:50:05.587 回答