我在IE8中的这行javascript上收到错误。注释ValidationSummary时不会发生这种情况。我相信这是由控件生成的代码。
ValidationSummary位于asp.net内容页面中使用的UserControl上。
当我使用IE开发人员工具时,它会突出显示此代码
document.getElementById('ctl00_ctl00_body_pageBody_ucCC1_valSummary').dispose = function() {
Array.remove(Page_ValidationSummaries, document.getElementById('ctl00_ctl00_body_pageBody_ucCC1_valSummary'));
}
(function() {var fn = function() {Sys.Extended.UI.ModalPopupBehavior.invokeViaServer('ctl00_ctl00_body_pageBody_mdlPopupExtender', true); Sys.Application.remove_load(fn);};Sys.Application.add_load(fn);})()
<asp:ValidationSummary
runat="server"
ID="valSummary"
ShowSummary="true"
DisplayMode="BulletList"
CssClass="summaryValidation"
HeaderText="Errors:"
ForeColor="White"
ValidationGroup="VldGrpHospital" />
答案 0 :(得分:1)
原来这是ajax控件工具包中的已知错误。他们声称它已在最新版本中得到修复,但我认为它没有。解决方法是创建一个服务器控件,该控件继承自验证摘要,并在两个javascript语句之间插入一个缺少的分号。
http://ajaxcontroltoolkit.codeplex.com/workitem/27024
[ToolboxData("")]
public class AjaxValidationSummary : ValidationSummary
{
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), this.ClientID, ";", true);
}
}
答案 1 :(得分:1)
接受的答案虽然可能有效,但可能不是最佳解决方案,因为它依赖于脚本块注册顺序匹配输出顺序,这不是一件好事。在RegisterStartupScript
的MSDN页面中:
使用RegisterStartupScript注册的启动脚本块不保证按照注册顺序输出。如果启动脚本块的顺序很重要,请使用StringBuilder对象在单个字符串中收集脚本块,然后将它们全部注册为单个启动脚本。
这是一个可能更好的修复:
public class ValidationSummarySansBug : ValidationSummary
{
// The bug is that the base class OnPreRender renders some javascript without a semicolon.
// This solution registers an almost-identical script *with* a semicolon using the same type and key and relies on the
// behavior of ClientScriptManager.RegisterStartupScript to ignore duplicate script registrations for the same type/key
protected override void OnPreRender(EventArgs e)
{
if (Enabled)
{
ScriptManager.RegisterStartupScript(
this,
typeof(ValidationSummary), // this type must match the base type's specified type for the script we're fixing
ClientID + "_DisposeScript", // this key must match the base type key for the script we're fixing
@"
document.getElementById('{0}').dispose = function() {{
Array.remove(Page_ValidationSummaries, document.getElementById('{0}'));
}};
".FormatInvariant(ClientID),
true);
}
base.OnPreRender(e);
}
}
答案 2 :(得分:0)
此错误是ASP.NET中验证控件的一部分,而不是AJAX Toolkit。您可以使用EnableClientScript="false"
关闭页面上所有验证控件的客户端验证,错误将会消失。
答案 3 :(得分:0)
我在Windows 7上遇到了同样的问题。这个问题的原因是Windows的当前更新(可能是.NET过时)。 (我已经关闭了自动更新)。安装更新后,问题已解决
答案 4 :(得分:0)
有同样的问题,但是对于一个完全不同的原因,有这个代码:
<% if(showvalidators){ %>
<tr>
<td>
<asp:ValidationSummary ID="SummaryValidator" runat="server" ForeColor="Red" EnableClientScript="true" DisplayMode="BulletList" ShowMessageBox="false" HeaderText="" />
</td>
</tr>
<%}%>
如果showvalidator为false,我必须显式禁用ValidationSummaryControl服务器端。 Javascriptvalidationcode尝试查找summarycontrol(getelementbyid)但未在页面中呈现。 Enableclientsidescript =“false”可以解决这个问题,因为没有javascriptcode正在寻找丢失的控件。我想这个行为在.NET 4.5中针对ValidationSummaryControl进行了解决,所以问题只发生在.NET 4.0中