【问题标题】:inherit from asp:validationsummary继承自 asp:validationsummary
【发布时间】:2010-10-15 03:48:22
【问题描述】:

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

因此我实现了新创建的服务器控件的渲染方法。新创建的控件继承自 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()。

有人能解决这个问题吗?

【问题讨论】:

  • 没有更多答案了吗??你们用什么来代替验证摘要?

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


【解决方案1】:

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

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

在 Render 中,从 ViewState 中读取 IsValid。

【讨论】:

    【解决方案2】:

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

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

    private bool _thePageIsBeingValidated = false;
    
    public bool ShouldIDoMyThing
    {
         get{ return (_thePageIsBeingValidated && this.Enabled && this.Page.IsPostback && this.Page.IsValid != null && this.Page.IsValid == false); }
    }
    

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2022-01-13
        • 1970-01-01
        相关资源
        最近更新 更多