【发布时间】:2009-06-22 02:25:55
【问题描述】:
当页面类属性IsValid为只读时,如何使用自己的验证方式进行设置?
到目前为止,我所能做的就是通过调用 Page.Validate() 来设置此属性。
我如何编写自己的函数来更改IsValid 属性,就像Page.Validate() 一样?
【问题讨论】:
标签: asp.net validation
当页面类属性IsValid为只读时,如何使用自己的验证方式进行设置?
到目前为止,我所能做的就是通过调用 Page.Validate() 来设置此属性。
我如何编写自己的函数来更改IsValid 属性,就像Page.Validate() 一样?
【问题讨论】:
标签: asp.net validation
您不直接设置 IsValid,而是调用 Page 对象的 Validate() 方法。如果您有自定义验证方法,则需要使用 CustomValidator 对象并在其服务器端验证属性中设置该函数。
<asp:CustomValidator ID="YourValidator" runat="server" SetFocusOnError="true"
ControlToValidate="YourControl"
ClientValidationFunction="YOUR_JAVASCRIPT_FUNCTION"
OnServerValidate="YOUR_SERVER_VALIDATION_FUNCTION" Text="*" />
【讨论】:
我知道这是旧的,但是,我需要做一些类似的事情,基本上是强制 IsValid 属性为假(不要问为什么)。这就是我基本上所做的(你在这里看到的是我的概念证明):
将此添加到 .aspx 页面:
<asp:TextBox ID="txtDummy" runat="server" Visible="false" />
<asp:RangeValidator ID="rvDummy" ControlToValidate="txtDummy" runat="server" MinimumValue="1" MaximumValue="2" />
然后我在后面的代码中添加了这个:
bool makeMyPageInvalid = true;
if (makeMyPageInvalid)
txtDummy.Text = "0";
Page.Validate();
if (Page.IsValid)
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "test", "alert('valid');", true);
else
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "test", "alert('not valid');", true);
您可以看到,这只允许您将页面验证强制为无效状态。您可以使用任何验证器或理由来设置它。希望这对某人有帮助!
【讨论】:
IsValid 属性是只读的,因为它旨在用于服务器和客户端验证器,例如 RequiredFieldValidator 和 RegularExpressionValidator。它是只读的,因为您不能以编程方式强制页面有效。在这种情况下,“有效”意味着页面上的所有验证器都评估为 true。
【讨论】:
如果您想使用一些 JavaScript,您可以在客户端通过修改变量 Page_IsValid 来实现,如下所示:
function pageLoad() {
Page_IsValid = false;
}
我使用它以防有人单击提交按钮而没有输入数据。然后我可以显示这样的警报:
function valid() {
if (!Page_IsValid) {
alert("Some Questions Remain Unanswered and are Marked with a Red Asterisc. ( * )");
}
(一开始我以为“谁会提交没有数据的表单”,但迟早我意识到它发生了)
【讨论】:
这是一个非常古老的问题,但它是在搜索中出现的,所以我想我会添加我的答案。首先,在您的帮助类中创建一个扩展方法。
public static IEnumerable<T> GetAllControlsOfType<T>(this Control parent) where T : Control
{
var result = new List<T>();
foreach (Control control in parent.Controls)
{
if (control is T)
{
result.Add((T)control);
}
if (control.HasControls())
{
result.AddRange(control.GetAllControlsOfType<T>());
}
}
return result;
}
现在在您的代码隐藏文件中,循环遍历页面上未验证的每个验证器。
foreach (var validator in Page.GetAllControlsOfType<BaseValidator>().Where(w => !w.IsValid))
{
validator.IsValid = true;
}
【讨论】: