继承自asp:validationsummary

时间:2009-03-24 08:05:15

标签: asp.net custom-server-controls validationsummary

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

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

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

我现在的问题是,如果一个按钮被触发并且他的属性CausesValidation被设置为false,我的validationsummary将抛出一个异常,因为我询问了Page.IsValid属性(并且仅在调用了Page时才设置.validate()。

有人解决这个问题吗?

3 个答案:

答案 0 :(得分: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. 的CausesValidation
  2. 的ValidationGroup
  3. 和其他东西
  4. 因此,ASP.net引擎本身将执行相关的验证器并将它们设置为IsValid

    修改
    要摆脱原始的HeaderText(仍然呈现):

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        // overwrite to hide the original HeaderText
    }
    

答案 1 :(得分:0)

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

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

在Render中,从ViewState中读取IsValid。

答案 2 :(得分: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); }
}