c# - 使用 ValidationProperty 属性防止 UserControl 的完整回发

标签 c# asp.net user-controls validation

我有一个实现 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;                    
        }
    }
}

这就是它的使用方式

<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
}

最佳答案

事实证明,ASP.NET 根本不关心元素标记。
我刚刚查看了验证码并发现了这个

function ValidatorGetValue(id) {
    var control;
    control = document.getElementById(id);
    if (typeof(control.value) == "string") {
        return control.value;
    }
    return ValidatorGetValueRecursive(control);
}

所以

<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>

实际上工作:\,和

一样
<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>

还有事件自动挂接 - 已验证的元素(带有 ClientID 的元素)及其子元素被连接以自动进行验证(查看 ValidatorHookupControl)。
这可能会导致:
1. 用户做某事
2. 执行验证
3. 更新验证值(验证后!)
在 div 上具有值的第一个示例以这种方式运行。

关于c# - 使用 ValidationProperty 属性防止 UserControl 的完整回发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131223/

相关文章:

c# - 将网页渲染为图片

c# - 在调试器中查看 XmlTextwriter 内容

asp.net - SQL CE azure 连接

c# - 如何在列表框中列出 newtonsoft Jtoken 或 JObjects 子项

c# - ASP.NET UserControl 和 DefaultEvent

asp.net - 如何从包含用户控件的中继器中获取所有文本框值?

c# - Visual Studio 2015,Resharper 在调试单元测试时卡住

c# - 每秒百万次迭代

asp.net - 如何在ASP.NET MVC 3中的HttpPost操作中禁用验证?

wpf - 使用 Grid 创建 Timeline 控件的可行性