Max*_*ich 5 c# asp.net validation user-controls
我有一个实现该ValidationProperty属性的ASP.NET用户控件.这个属性成功地使我可以使用RequiredFieldValidator我的自定义控件,但是在验证时它会导致完整的回发而不是使用客户端基于javascript的验证.
有没有办法防止这种情况并启用客户端验证而不使用自定义验证器?
这就是我的UserControl的样子.
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ucBooleanRadio.ascx.cs" Inherits="MyCompany.Web.UserControls.ucBooleanRadio" %>
<div class="BooleanRadio">
<input runat="server" id="radTrue" type="radio" name="BooleanRadio" value="True" /> Yes
<input runat="server" id="radFalse" type="radio" name="BooleanRadio" value="False" /> No
</div>
[ValidationProperty("Checked")]
public partial class ucBooleanRadio : System.Web.UI.UserControl
{
public Nullable<bool> Checked
{
get
{
if (radTrue.Checked || radFalse.Checked)
return radTrue.Checked;
else
return null;
}
set
{
radTrue.Checked = value != null ? value.Value : false;
radFalse.Checked = value != null ? !value.Value : false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是它的使用方式
<uc1:ucBooleanRadio ID="ucAgree" runat="server" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server" CssClass="Validator" Display="Dynamic" ControlToValidate="ucAgree" InitialValue="" ErrorMessage="You must agree to continue."></asp:RequiredFieldValidator>
Page.Validate();
if (Page.IsValid)
{
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
事实证明,ASP.NET 并不关心元素标签。
我刚刚查看了验证代码并发现了这个
function ValidatorGetValue(id) {
var control;
control = document.getElementById(id);
if (typeof(control.value) == "string") {
return control.value;
}
return ValidatorGetValueRecursive(control);
}
Run Code Online (Sandbox Code Playgroud)
所以
<div class="BooleanRadio" id="<%= ClientID %>" value="<%= radTrue.Checked? "true" : radFalse.Checked? "false" : "" %>">
<% radTrue.Attributes["onclick"] = "document.getElementById('" + ClientID + "').value='true'"; %>
<% radFalse.Attributes["onclick"] = "document.getElementById('" + ClientID + "').value='false'"; %>
<input runat="server" id="radTrue" type="radio" name="BooleanRadio" value="True" /> Yes
<input runat="server" id="radFalse" type="radio" name="BooleanRadio" value="False" /> No
</div>
Run Code Online (Sandbox Code Playgroud)
实际上有效:\,就像
<div class="BooleanRadio" id="<%= ClientID %>">
<input runat="server" id="radTrue" type="radio" name="BooleanRadio" value="True" /> Yes
<input runat="server" id="radFalse" type="radio" name="BooleanRadio" value="False" /> No
</div>
Run Code Online (Sandbox Code Playgroud)
并且有事件自动挂钩 - 经过验证的元素(带有 ClientID 的元素)及其子元素被连接以自动进行验证(查看 ValidatorHookupControl)。
这可能会导致:
1. 用户执行某些操作
2. 执行验证
3. 更新要验证的值(验证后!)
第一个在 div 上使用值的示例的行为方式如下。
| 归档时间: |
|
| 查看次数: |
2683 次 |
| 最近记录: |