【问题标题】:ASP.NET c# Form validationASP.NET c# 表单验证
【发布时间】:2014-02-11 19:01:13
【问题描述】:

我有一个禁用所有验证器的 ASP.NET Web 表单。我只想为单击提交按钮后用户可见的那些控件启用验证器。

这是我的功能:

protected void Submit_Click(object sender, System.EventArgs e) {
    if (ddlSite.Visible){    
        rfvSite.Enabled = true;
        base.Validate();
    }
    else {
        rfvSite.Enabled = false;
    }

上面的代码对于大多数控件都可以正常工作。但是我有几个控件的显示设置为无。我只在做出某些选择时才使它们可见。这些不可见的控件正在引起问题。例如。 pnlOpv 面板包含一个文本框,其中包含两个验证器 revOpv 和 rfvOpv。

if (pnlOpv.Visible){
    revOpv.Enabled = true;
    rfvOpv.Enabled = true;
}
else {
    revOpv.Enabled = false;
    rfvOpv.Enabled = false;
}

上面的代码给我带来了问题,因为即使上面的文本框不可见,因为它包含在不可见的面板中。出于某种奇怪的原因,表单认为验证器已启用,并将返回页面无效。有没有发现任何错误?

<asp:panel id="pnlOpv" style="margin:0px; padding:0px; display: none;" runat="server">                            
    <label for="txtOpoo" id="opo" style="display:inline; margin-top:5px;"><strong>Other Place of Visit</strong></label>
    <asp:TextBox type="text" id="txtOpv" tabindex="2" size="20" maxlength="50" runat="server" style="display:inline; margin-top:5px; background-color:#FCFCFC" EnableViewState="true" />
    <asp:RegularExpressionValidator ID="revOpv" runat="server" 
        ControlToValidate="txtOpv"
        ValidationExpression="^[a-zA-Z0-9''-'-,.\s]{1,50}$"
        Display="Dynamic"
        Font-Names="verdana" Font-Size="10pt" Enabled="false" EnableClientScript="true" EnableViewState="true"> Invalid format.
    </asp:RegularExpressionValidator>
    <asp:RequiredFieldValidator id="rfvOpv" runat="server"
        ControlToValidate="txtOpv"
        Display="Dynamic"
        Font-Names="Verdana" Font-Size="10pt" Enabled="false" EnableViewState="true" EnableClientScript="true">
        Please type other place of visit.
    </asp:RequiredFieldValidator>                                
</asp:panel> 

【问题讨论】:

  • 为什么不展示模型?查看需要什么并检查您在那里的验证以及您想要在代码中实现的验证。
  • 你为什么不尝试使用验证组?

标签: c# asp.net validation


【解决方案1】:

面板具有“display: none”样式的事实并不意味着它是不可见的。对于 ASP.Net 视图状态,面板及其上的所有内容都是可见的。仅当您将 ASP.Net 属性设置为“visible=false”时,它才会不可见。

现在,对于您使用样式和 javascript(我猜)隐藏/显示的那些控件,我建议在运行时检查属性并基于它触发验证,但我怀疑这些属性不会包含任何与样式相关的内容(同样,显示:无)。

我怀疑这是在触发验证并检查可见/不可见的验证时导致您出现问题的原因。

如果有帮助或有任何其他问题,请告诉我!

【讨论】:

  • 我将添加 visible=false 并查看它是否有效,而不是 display:none。是的,我正在使用 JavaScript 来隐藏/取消隐藏面板。如何使用 JavaScript 设置 asp.net visible=true?
  • 我认为你不能使用 Javascript 做到这一点。您需要在托管代码中从服务器端执行此操作。
【解决方案2】:

您所拥有的应该可以工作,因为一旦您设置 Enabled=false,验证器就会被禁用。然后,即使您明确地将文本框设置为可见,验证器也不会触发。

所以你的代码中还有其他东西导致了这种行为。

您是否正在使用您的面板/文本框在 javascript 中做一些事情?

您是在使用与触发验证器相同的回发控件还是不同的控件?

示例代码:

$(function () {
               //btnTogglePanel is the button that show/hide the panel
                $("#btnTogglePanel").click(function () {
                    $("#pnlOpv").toggle();
                    var pnlisvisible = $("#pnlOpv").is(':visible');
                    var revOpv = document.getElementById("revOpv");
                    var rfvOpv = document.getElementById("rfvOpv");
                    ValidatorEnable(revOpv, pnlisvisible);
                    ValidatorEnable(rfvOpv, pnlisvisible);
                });
            });

【讨论】:

  • 我确信我能够打开验证器,因为表单中的某些控件始终可见,但默认情况下它们的验证器被禁用。单击提交按钮后,我启用它们。只有那些隐藏的控件会导致此问题。这个表格是活的而且很长,所以我需要找到解决这个问题的方法。我没有办法从头开始。
  • 我看到你在其他评论中说你在客户端显示/隐藏面板。因此,在这种情况下,您需要在客户端启用/禁用验证器控件。例如 aspsnippets.com/Articles/… 如果您需要有关面板特定代码的帮助,请告诉我。
  • 会的。谢谢 GBS。我会保持联系,因为这超出了我对 asp.net 的理解,我需要一些代码方面的帮助。是的,当用户单击提交按钮时,我正在代码隐藏页面中启用/禁用验证器。
  • 到目前为止,我对这个论坛软件感到非常沮丧。我要离开,因为没有太多,发布任何内容都有问题。
  • 你的意思是你的stackoverflow有问题吗?如果是,请说明您面临什么问题?
猜你喜欢
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2017-09-28
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多