使用客户端进行用户控制服务器端自定义验证;选择了错误的客户端验证器

发布于 2024-10-04 01:14:36 字数 4064 浏览 2 评论 0原文

我有一个用户控件,其中包含一个 CustomValidator,它根据是否选中 RadioButton 来使用(有几个 RadioButton,我只显示相关的一个)

<asp:RadioButton runat="Server" ID="RadioBetween" GroupName="DateGroup" CssClass="date_group_options_control_radio" />
<asp:TextBox ID="FromDate" runat="server" Columns="8"></asp:TextBox>
<asp:TextBox ID="ToDate" runat="server" Columns="8"></asp:TextBox>

<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic" ClientValidationFunction="ValidateDateFields_Client" OnServerValidate="ValidateDateFields"></asp:CustomValidator>

有一些客户端+服务器端验证代码(服务器端代码执行完全相同的操作,为简洁起见,已跳过)

<script type="text/javascript">
function ValidateDateFields_Client(source, args)
{
    if ("<%=EnableValidation%>" == "True")
    {
        var bRadioBetweenSelected = false;

        var oRadio = document.getElementById('<%=RadioBetween.ClientID%>');
        if (oRadio != null && (oRadio.checked == true || oRadio["checked"] == true))
        {
            bRadioBetweenSelected = true;
        }

        if (bRadioBetweenSelected)
        {
            var oFromDate = document.getElementById('<%=FromDate.ClientID%>');
            var oToDate = document.getElementById('<%=ToDate.ClientID%>');

            if (oFromDate != null && oToDate != null)
            {
                var sFromDate = oFromDate.value;
                var sToDate = oToDate.value;

                source.innerHTML = ValidateFromToDate(sFromDate, sToDate, args);

                if (!args.IsValid)
                {
                    return;
                }
            }
            else
            {
                args.IsValid = true;
            }
        }
        else
        {
            args.IsValid = true;
        }
    }
}
</script>

页面中有此控件的两个实例。运行客户端版本时,它会遇到错误的版本(禁用的控件版本)。您可以从生成的 HTML 中看到两者都已正确指定。我不确定 .NET 如何确定要调用哪个客户端函数,因为它们具有相同的名称。

<script type="text/javascript">
//<![CDATA[
var ctl00_MCPH1_QueryTextValidator = document.all ? document.all["ctl00_MCPH1_QueryTextValidator"] : document.getElementById("ctl00_MCPH1_QueryTextValidator");
ctl00_MCPH1_QueryTextValidator.controltovalidate = "ctl00_MCPH1_SearchTextBox";
ctl00_MCPH1_QueryTextValidator.focusOnError = "t";
ctl00_MCPH1_QueryTextValidator.display = "Dynamic";
ctl00_MCPH1_QueryTextValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_QueryTextValidator.clientvalidationfunction = "ValidateQueryText_Client";
ctl00_MCPH1_QueryTextValidator.validateemptytext = "true";
var ctl00_MCPH1_DisplayOptionsControl1_DateValidator = document.all ? document.all["ctl00_MCPH1_DisplayOptionsControl1_DateValidator"] : document.getElementById("ctl00_MCPH1_DisplayOptionsControl1_DateValidator");
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.display = "Dynamic";
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.clientvalidationfunction = "ValidateDateFields_Client";
var ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator = document.all ? document.all["ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator"] : document.getElementById("ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator");
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.display = "Dynamic";
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.clientvalidationfunction = "ValidateDateFields_Client";
//]]>
</script>

我需要添加一些东西来限制它吗?实现这一目标的最佳方法是什么?如果我禁用第二个控件的加载,则一切正常。

I have a user control which contains a CustomValidator which is used according to whether a RadioButton is checked or not (there are several RadioButtons, I'm only showing the relevant one)

<asp:RadioButton runat="Server" ID="RadioBetween" GroupName="DateGroup" CssClass="date_group_options_control_radio" />
<asp:TextBox ID="FromDate" runat="server" Columns="8"></asp:TextBox>
<asp:TextBox ID="ToDate" runat="server" Columns="8"></asp:TextBox>

<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic" ClientValidationFunction="ValidateDateFields_Client" OnServerValidate="ValidateDateFields"></asp:CustomValidator>

There is some client + server side validation code (the server side code does exactly the same thing and is skipped for brevity)

<script type="text/javascript">
function ValidateDateFields_Client(source, args)
{
    if ("<%=EnableValidation%>" == "True")
    {
        var bRadioBetweenSelected = false;

        var oRadio = document.getElementById('<%=RadioBetween.ClientID%>');
        if (oRadio != null && (oRadio.checked == true || oRadio["checked"] == true))
        {
            bRadioBetweenSelected = true;
        }

        if (bRadioBetweenSelected)
        {
            var oFromDate = document.getElementById('<%=FromDate.ClientID%>');
            var oToDate = document.getElementById('<%=ToDate.ClientID%>');

            if (oFromDate != null && oToDate != null)
            {
                var sFromDate = oFromDate.value;
                var sToDate = oToDate.value;

                source.innerHTML = ValidateFromToDate(sFromDate, sToDate, args);

                if (!args.IsValid)
                {
                    return;
                }
            }
            else
            {
                args.IsValid = true;
            }
        }
        else
        {
            args.IsValid = true;
        }
    }
}
</script>

There are two instances of this control in the page. When running the client side version it hits the wrong one (the version of the control which is disabled). You can see from the generated HTML both are correctly specified. I'm not sure how .NET works out which clientside function to call given they both have the same name.

<script type="text/javascript">
//<![CDATA[
var ctl00_MCPH1_QueryTextValidator = document.all ? document.all["ctl00_MCPH1_QueryTextValidator"] : document.getElementById("ctl00_MCPH1_QueryTextValidator");
ctl00_MCPH1_QueryTextValidator.controltovalidate = "ctl00_MCPH1_SearchTextBox";
ctl00_MCPH1_QueryTextValidator.focusOnError = "t";
ctl00_MCPH1_QueryTextValidator.display = "Dynamic";
ctl00_MCPH1_QueryTextValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_QueryTextValidator.clientvalidationfunction = "ValidateQueryText_Client";
ctl00_MCPH1_QueryTextValidator.validateemptytext = "true";
var ctl00_MCPH1_DisplayOptionsControl1_DateValidator = document.all ? document.all["ctl00_MCPH1_DisplayOptionsControl1_DateValidator"] : document.getElementById("ctl00_MCPH1_DisplayOptionsControl1_DateValidator");
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.display = "Dynamic";
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.clientvalidationfunction = "ValidateDateFields_Client";
var ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator = document.all ? document.all["ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator"] : document.getElementById("ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator");
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.display = "Dynamic";
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.clientvalidationfunction = "ValidateDateFields_Client";
//]]>
</script>

Do i need to add something in to scope it? What's the best way to achieve this? If I disable the loading of the second control everything works fine.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

美人迟暮 2024-10-11 01:14:36

为您的两个用户控件生成具有相同名称的客户端验证函数。您的页面中将有两个 ValidateDateFields_Client() 函数,当然解释器只会调用其中之一。

解决该问题的一种方法是生成唯一的函数名称:

<script type="text/javascript">
function ValidateDateFields_Client_<%=RadioBetween.ClientID%>(source, args)
{
    // ...
}
</script>


<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic"
    ClientValidationFunction="ValidateDateFields_Client_"
    OnServerValidate="ValidateDateFields"></asp:CustomValidator>


protected void Page_PreRender(object sender, EventArgs e)
{
    DateValidator.ClientValidationFunction += RadioBetween.ClientID;
}

Your client validation function is generated with the same name for both your user controls. There will be two ValidateDateFields_Client() functions in your page, and of course the interpreter will only call one of them.

One way to work around that problem would be to generate unique function names:

<script type="text/javascript">
function ValidateDateFields_Client_<%=RadioBetween.ClientID%>(source, args)
{
    // ...
}
</script>


<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic"
    ClientValidationFunction="ValidateDateFields_Client_"
    OnServerValidate="ValidateDateFields"></asp:CustomValidator>


protected void Page_PreRender(object sender, EventArgs e)
{
    DateValidator.ClientValidationFunction += RadioBetween.ClientID;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文