0

摘要:
禁用的 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;
}

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

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

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

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


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

经过大量播放后,如果InnerHTML验证器仅包含纯文本(即没有 ASP 服务器端控件),那么InnerHTML无论验证器是否启用,它都会在回发中持续存在。

但是,如果InnerHTML 任何纯文本(空格除外)开头并且还具有任何服务器端控件,那么当验证器被禁用时,它不会在回发中正确保留。

我不明白为什么会这样,但是对于较小的格式问题,我当然可以应付...要么,要么我必须在&nbsp;里面放一个文字或标签...很多不同的style选择<img在那一个。

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

如果在接下来的几天里没有人想添加任何其他内容,我将自己用上述内容“回答”这个问题。

4

1 回答 1

0

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

在我拥有它之前...

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

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

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

希望这将帮助其他人,以防万一他们发现自己处于困境中。

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

于 2012-07-13T10:27:43.420 回答