ValidationSummary javascript error

Я получаю сообщение об ошибке в этой строке JavaScript в IE8. Это не происходит, когда ValidationSummary закомментирован. Я считаю, что это код, который генерируется элементом управления.

ValidationSummary находится на UserControl, который используется на странице содержимого в asp.net.

Когда я использую инструменты разработчика 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 ответов

Решение

Оказывается, это известная ошибка в наборе инструментов управления 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);
    }
}

Принятый ответ, хотя и может работать, может быть не самым лучшим решением, поскольку он основан на порядке регистрации блоков скриптов, совпадающем с порядком вывода, на который нельзя полагаться. Со страницы MSDN для RegisterStartupScript:

Блоки сценариев запуска, которые зарегистрированы с помощью 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);
    }
}

У меня была такая же проблема на Windows 7. Причиной этой проблемы были не текущие обновления Windows (возможно.NET устарела). (Я автоматически отключил обновления). После установки обновлений проблема была решена

Эта ошибка является частью элементов управления валидации в ASP.NET, а не AJAX Toolkit. Вы можете отключить проверку на стороне клиента из всех элементов управления проверки на вашей странице с помощью EnableClientScript="false" и ошибки исчезнут.

Была та же проблема, но по совершенно другой причине, имел этот код:

<% if(showvalidators){ %>
<tr>
    <td>
    <asp:ValidationSummary ID="SummaryValidator" runat="server" ForeColor="Red" EnableClientScript="true" DisplayMode="BulletList" ShowMessageBox="false" HeaderText="" />
    </td>
</tr>
<%}%>

Мне пришлось явно отключить серверную часть ValidationSummaryControl, если showvalidator был ложным. Javascriptvalidationcode пытается найти summarycontrol (getelementbyid), но в не был отображен на странице. Enableclientsidescript="false" исправляет это, потому что javascriptcode больше не ищет отсутствующий элемент управления. Я полагаю, что это поведение было обращено в.NET 4.5 для ValidationSummaryControl, поэтому проблема возникает только в.NET 4.0

Другие вопросы по тегам