2012-11-01 51 views
2

我在此问题的项目中陷入困境。 Google搜索了很多,但没有得到解决方案。复合控件中的自定义验证器未触发

我的目标是创建一个带有标签,文本框,两个必需字段验证程序和一个自定义验证程序的复合控件。我的自定义控件的代码如下: -

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace AFGISServerControl 
{ 
    [ToolboxData("<{0}:ValidatorTextBox runat="\""server\"> </{0}:ValidatorTextBox>")] 
    public class ValidatorTextBox : CompositeControl 
    { 
     private TextBox InputTextBox; 
     private Label InputLabel; 
     private RequiredFieldValidator RequiredValidator1; 
     private RequiredFieldValidator RequiredValidator2; 
     private CustomValidator cv; 
     private static readonly object EventValidateKey = new object(); 

     protected override void OnLoad(EventArgs e) 
     { 
      EnsureChildControls(); 
      base.OnLoad(e); 
     } 
     protected override void CreateChildControls() 
     { 
      Controls.Clear(); 
      InputTextBox = new TextBox(); 
      InputLabel = new Label(); 
      InputTextBox.ID = "inputTextBox"; 
      //InputTextBox.AutoPostBack = true; 

      RequiredValidator1 = new RequiredFieldValidator(); 
      RequiredValidator1.ID = this.ID + "_RFV1"; 
      RequiredValidator1.ControlToValidate = InputTextBox.ID; 
      RequiredValidator1.ValidationGroup = string.Empty; 
      RequiredValidator1.Display = ValidatorDisplay.Dynamic; 
      RequiredValidator1.ErrorMessage = Caption.ToString() + " is mandatory"; 

      RequiredValidator2 = new RequiredFieldValidator(); 
      RequiredValidator2.ID = this.ID + "_RFV2"; 
      RequiredValidator2.ControlToValidate = InputTextBox.ID; 
      RequiredValidator2.Display = ValidatorDisplay.Dynamic; 
      RequiredValidator2.ErrorMessage = Caption.ToString() + " is mandatory"; 

      cv = new CustomValidator(); 
      cv.ID = this.ID + "_CV"; 
      cv.ControlToValidate = InputTextBox.ID; 
      cv.SetFocusOnError = true; 
      cv.Display = ValidatorDisplay.Dynamic; 
      cv.ErrorMessage = this.CustomErrorMessage; 
      cv.ValidateEmptyText = true; 
      cv.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.cv_ServerValidate); 

      this.Controls.Add(InputLabel); 
      this.Controls.Add(InputTextBox); 
      this.Controls.Add(RequiredValidator1); 
      this.Controls.Add(RequiredValidator2); 
      this.Controls.Add(cv); 
     } 

     #region properties 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Value") 
     ] 
     public string Text 
     { 
      get 
      { 
       EnsureChildControls(); 
       return InputTextBox.Text; 
      } 
      set 
      { 
       EnsureChildControls(); 
       InputTextBox.Text = value; 
      } 
     } 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Validation Group") 
     ] 
     public string ValidationGroup 
     { 
      get 
      { 
       EnsureChildControls(); 
       return InputTextBox.ValidationGroup; 
      } 
      set 
      { 
       EnsureChildControls(); 
       InputTextBox.ValidationGroup = value; 
       RequiredValidator2.ValidationGroup = value; 
       cv.ValidationGroup = value; 
      } 
     } 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Error message for the custom validator.") 
     ] 
     public string CustomErrorMessage 
     { 
      get 
      { 
       EnsureChildControls(); 
       return cv.ErrorMessage; 
      } 
      set 
      { 
       EnsureChildControls(); 
       cv.ErrorMessage = value; 
      } 
     } 
     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("Validity of custom validator.") 
     ] 
     public Boolean isValid 
     { 
      get 
      { 
       EnsureChildControls(); 
       return cv.IsValid; 
      } 
      set 
      { 
       EnsureChildControls(); 
       cv.IsValid = value; 
      } 
     } 

     [ 
     Bindable(true), 
     Category("Default"), 
     DefaultValue(""), 
     Description("The text for the name label.") 
     ] 
     public string Caption 
     { 
      get 
      { 
       EnsureChildControls(); 
       return InputLabel.Text; 
      } 
      set 
      { 
       EnsureChildControls(); 
       InputLabel.Text = value; 
      } 
     } 
     #endregion 

     protected override void RecreateChildControls() 
     { 
      EnsureChildControls(); 
     } 

     [ 
     Category("Action"), 
     Description("Raised on Text Change") 
     ] 
     public event ServerValidateEventHandler Validate 
     { 
      add 
      { 
       Events.AddHandler(EventValidateKey, value); 
      } 
      remove 
      { 
       Events.RemoveHandler(EventValidateKey, value); 
      } 
     } 
     protected virtual void OnValidate(ServerValidateEventArgs args) 
     { 
      EventHandler ValidateHandler = (EventHandler)Events[EventValidateKey]; 
      if (ValidateHandler != null) 
      { 
       ValidateHandler(this, args); 
      } 
     } 
     protected void cv_ServerValidate(object source, ServerValidateEventArgs args) 
     { 
      OnValidate(args); 
     } 

     protected override void Render(HtmlTextWriter writer) 
     { 
      AddAttributesToRender(writer); 
      InputLabel.RenderControl(writer); 
      InputTextBox.RenderControl(writer); 
      RequiredValidator1.RenderControl(writer); 
      RequiredValidator2.RenderControl(writer); 
      cv.RenderControl(writer); 
     }   
    } 
} 

我的aspx代码

<cc1:ValidatorTextBox ID="ValidatorTextBox1" runat="server" Caption="Service No" 
     CustomErrorMessage="Not Valid" ValidationGroup="test" 
     OnValidate="CVText" /> 
    <asp:Button ID="Button1" runat="server" Text="Button" /> 

aspx.cs

所面临的具体问题是

背后“的方法
  • 代码无效“事件未被触发
  • 必填字段验证器er ror消息仅显示“是强制性的”,标题不加前缀。

我会很乐意提供建议。

回答

0

打破头后,我改变了这种控制的整个方式。提前使用ivalidator。这是一个非常有效的方法。

0

有几件事情:

  • 你需要调用Page.Validate()或火中的CausesValidation =回传的源代码控制如此。确保您在执行验证时不指定ValidationGroup或使用“test”ValidationGroup。
  • 在CreateChildControls期间正在设置必需的字段验证程序。您的标题正在从输入文本中提取,直到发布后才会被填充。在加载ViewState之前,您的CreateChildControls可能会发生。您可能希望使用JavaScript来设置RequiredFieldValidator文本,或者在文本更改时使用_TextChanged事件处理程序来更新错误消息。你采取的方法显然取决于你的具体用例需求。
+0

谢谢您的建议。 Page.Validate()确实调用了代码隐藏方法。但其他选项 - CausesVaidation属性不适用于组合控件 – Sameer

+0

CausesValidation将位于按钮上,而不一定位于组合控件上。 –

相关问题