【问题标题】:Disabled validators losing content on postback禁用的验证器在回发时丢失内容
【发布时间】:2012-07-10 11:51:30
【问题描述】:

总结:
禁用的 ASP.NET 验证器在回发到服务器时会丢失其 InnerHTML 内容,然后在启用时(通过 JavaScript 在本地)显示 ErrorMessage 而不是原始的 InnerHTML

更多详情:
我处理一些复杂的表单,这些表单需要许多单独的控件可见/不可见,并且需要启用/禁用它们的验证器,具体取决于其他控件的选择。

所有验证器都包含一个“星号”图像,错误消息通过中心 asp:ValidatorSummary 对象显示。例如(此处为查看格式,通常没有空格 UPDATE,这实际上是不正确的,请参阅下面的更新)...

<asp:RequiredFieldValidator runat="server" ID="valName" 
  ControlToValidate="txtName" ErrorMessage="Enter a name">
    <img runat="server" src="~/images/error.gif" />
</asp:RequiredFieldValidator>

我没有在每个验证器上使用asp:CustomValidator(每个验证器都需要本地JavaScript 和服务器端处理程序),我只是在普通验证器上设置.enabled = false 作为“父”控件的事件处理程序的一部分。 (控件的状态也会在初始页面加载以及后续的回发页面加载时在服务器端设置。)

function showName(show){
  document.getElementById("txtName").style.display = (show ? "" : "none");
  document.getElementById("valName").enabled = show;
}

问题在于禁用验证器、回发表单...然后更改控件(通过用户交互)并启用验证器的事件序列。如果验证器现在失败(在尝试回发时),&lt;img 代码已经消失,因此它会在图像应该出现的位置显示 ErrorMessage 文本。

只要验证器保持启用状态,InnerHTML 就会一直存在。

除了在每个页面加载时动态地将图像添加到每个验证器(我真的不想这样做),或者将它们全部转换为CustomValidators(我再次真的不想这样做),有人知道解决这个问题的方法吗?这是一个已知的错误吗(因为我找不到任何明显的东西)?

我在 Visual Studio 2010 下使用 ASP.NET 2.0 - 不幸的是,目前无法升级到更高版本的 ASP.NET。

更新
我刚刚发现&lt;img 标记实际上前面有一个&amp;nbsp; 实体......如果我删除它,只在验证器中留下&lt;img 标记,它就可以工作。

在玩了很多之后,据我所知,如果验证器的 InnerHTML 只包含纯文本(即没有 ASP 服务器端控件),那么 InnerHTML 将在回发中持续存在,无论验证器是否启用。

但是,如果 InnerHTML 任何纯文本(空格除外)开头并且还具有任何服务器端控件,那么当验证器在已禁用。

我不明白为什么会这样,但是对于较小的格式问题,我当然可以处理它......要么,要么我必须将 &amp;nbsp; 放在文字中,或者 style &lt;img 标签...有很多不同的选项。

使用 ASP.NET 4.0 测试平台应用程序,我可以确认在该版本中发生了同样的事情。

如果在接下来的几天里没有人想补充什么,我会用上面的内容自己“回答”这个问题。

【问题讨论】:

    标签: asp.net validation


    【解决方案1】:

    正如我在更新的问题中所述,问题的原因是验证器的 InnerHTML&amp;nbsp; 开头,然后包含服务器端控件。

    在我拥有它之前...

    <asp:RequiredFieldValidator runat="server" ID="valName" ControlToValidate="txtName"
      ErrorMessage="Enter a name">&nbsp;<img runat="server" src="~/images/error.gif" 
      /></asp:RequiredFieldValidator>
    

    为了修复它,我只是删除了&amp;nbsp;...

    <asp:RequiredFieldValidator runat="server" ID="valName" ControlToValidate="txtName"
      ErrorMessage="Enter a name"><img runat="server" src="~/images/error.gif" 
      /></asp:RequiredFieldValidator>
    

    希望这会帮助其他人,以防万一他们发现自己处于某种情况下。

    与往常一样,如果有人提出不同的答案/解决方案,我总是愿意重新考虑我的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多