ValidationSummary javascript错误

时间:2012-02-13 17:15:54

标签: javascript asp.net validationsummary

我在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" />

5 个答案:

答案 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中