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消息僅顯示「是強制性的」,標題不加前綴。
我會很樂意提供建議。
謝謝您的建議。 Page.Validate()確實調用了代碼隱藏方法。但其他選項 - CausesVaidation屬性不適用於組合控件 – Sameer
CausesValidation將位於按鈕上,而不一定位於組合控件上。 –