ModalPopupExtender и проблемы с проверкой

Проблема, с которой я сталкиваюсь, заключается в том, что когда на странице есть проверка, и я пытаюсь отобразить всплывающее окно модели, всплывающее окно не отображается. И с помощью fire-bug я заметил, что возникает ошибка.

Кнопка, которая используется для отображения всплывающего окна, имеет проверку причины, установленную на false, поэтому я застрял в том, что вызывает ошибку.

Я создал образец страницы, чтобы изолировать проблему, с которой я столкнулся, любая помощь будет принята с благодарностью.

Ошибка

function () {Array.remove(Page_ValidationSummaries, document.getElementById("ValidationSummary1"));}(function () {var fn = function () {AjaxControlToolkit.ModalPopupBehavior.invokeViaServer("mpeSelectClient", true);Sys.Application.remove_load(fn);};Sys.Application.add_load(fn);}) is not a function
http://localhost:1131/WebForm1.aspx
Line 136

ASP

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CLIck10.WebForm1" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <div>
            <asp:Button ID="btnPush" runat="server" Text="Push" CausesValidation="false" onclick="btnPush_Click" />
            <asp:TextBox ID="txtVal" runat="server" />
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtVal" ErrorMessage="RequiredFieldValidator" />
            <asp:ValidationSummary ID="ValidationSummary1" runat="server" />



        <asp:Panel ID="pnlSelectClient" Style="display: none" CssClass="box" runat="server">
        <asp:UpdatePanel ID="upnlSelectClient" runat="server">
            <ContentTemplate>
                <asp:Button ID="btnOK" runat="server" UseSubmitBehavior="true" Text="OK" CausesValidation="false" OnClick="btnOK_Click" />
                <asp:Button ID="btnCancel" runat="server" Text="Cancel" CausesValidation="false" OnClick="btnCancel_Click" />
            </ContentTemplate>
        </asp:UpdatePanel>
        </asp:Panel>

        <input id="popupDummy" runat="server" style="display:none" />

        <ajaxToolkit:ModalPopupExtender ID="mpeSelectClient" runat="server" 
        TargetControlID="popupDummy"
        PopupControlID="pnlSelectClient" 
        OkControlID="popupDummy"
        BackgroundCssClass="modalBackground" 
        CancelControlID="btnCancel" 
        DropShadow="true"  />   
    </div>
</form>

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CLIck10
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnOK_Click(object sender, EventArgs e)
        {
            mpeSelectClient.Hide();
        }

        protected void btnCancel_Click(object sender, EventArgs e)
        {
            mpeSelectClient.Hide();
        }

        protected void btnPush_Click(object sender, EventArgs e)
        {
            mpeSelectClient.Show();
        }
    }
}

person Malachi    schedule 23.09.2009    source источник
comment
Являются ли эти заглушки обработчиков кликов пустыми только потому, что вам еще не приходилось их заполнять, или вам требуется обратная передача, чтобы скрыть модальное всплывающее окно? Если обратная передача не требуется, рассмотрите возможность использования клиентских методов модального всплывающего окна для его открытия и закрытия.   -  person Nathan Taylor    schedule 23.09.2009
comment
Я буду добавлять к ним код, это было просто для демонстрации моей ошибки.   -  person Malachi    schedule 23.09.2009


Ответы (7)


Это проблема с использованием как ValidationSummary, так и ModalPopup.

см. здесь: http://ajaxcontroltoolkit.codeplex.com/WorkItem/View.aspx?WorkItemId=12835

Проблема в том, что не хватает ";" между двумя введенными скриптами.

Их решение состоит в том, чтобы создать/использовать собственный серверный элемент управления, наследуемый от ValidationSummary, который вводит ";" в сценарий запуска страницы, чтобы исправить ошибку:

[ToolboxData("")]
public class AjaxValidationSummary : ValidationSummary
{
  protected override void OnPreRender(EventArgs e)
  {
    base.OnPreRender(e);
    ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), this.ClientID, ";", true);
  }
}
person Aaron Hoffman    schedule 26.04.2010

Попробуйте установить для свойства ValidationSummary «Enabled» значение false для этого события: «btnPush_Click»; а затем снова установить его на enabled = «true» для этих событий: «btnOK_Click», «btnCancel_Click».

Я думаю, это сработает, если у вас нет сводки проверки внутри панели, которую вы хотите открыть. Но это не решение, если вам нужна сводка проверки внутри всплывающей панели,... ведьма - это мой случай :( .

Наилучшие пожелания.

person TestSubject09    schedule 05.10.2009

Я попробовал все доступные ответы в Интернете, но ничего не получилось. Затем я попытался переместить свой расширитель модального всплывающего окна в самый конец HTML, и он отлично работает для меня. Я и мои пользователи счастливы :) Я не использую тег FROM, я использую заполнитель содержимого, как показано ниже:

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
 <table id="tblMessage" runat="server" width="100%" >
    <tr align="center">
        <td align="center">

основное содержание и

<asp:Panel ID="pnlSelectClient" Style="display: none" CssClass="box" runat="server">

  <asp:ValidationSummary ID="ValidationSummary1" runat="server" />
    <asp:UpdatePanel ID="upnlSelectClient" runat="server">
        <ContentTemplate>
            <asp:Button ID="btnOK" runat="server" UseSubmitBehavior="true" Text="OK" CausesValidation="false" OnClick="btnOK_Click" />
            <asp:Button ID="btnCancel" runat="server" Text="Cancel" CausesValidation="false" OnClick="btnCancel_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>
    </asp:Panel>

Если вы заметили, что у меня есть сводка проверки внутри панели, потому что я хочу сообщение об ошибке во всплывающем окне (у меня также есть дополнительный контроль во всплывающем окне). и

Еще немного тега HTML здесь, так как у меня так много других дел на одной странице. непосредственно перед закрывающим тегом TABLE

<ajaxToolkit:ModalPopupExtender ID="mpeSelectClient" runat="server" 
    TargetControlID="popupDummy"
    PopupControlID="pnlSelectClient" 
    OkControlID="popupDummy"
    BackgroundCssClass="modalBackground" 
    CancelControlID="btnCancel" 
    DropShadow="true"  />

</table>

Готово. Работает. Надеюсь, что это работает и для других.

person user2217342    schedule 27.03.2013
comment
перемещение modalpopupextender после того, как панель сработала для меня. Спасибо - person Evan Larsen; 05.09.2013

Используете ли вы группы проверки в любом месте на странице? У меня были проблемы с событиями элементов управления, которые не срабатывали, когда они не являются частью группы проверки, а другие элементы управления на странице являются частью группы проверки.

person TGnat    schedule 23.09.2009
comment
Мне помогло размещение всех элементов управления в ValidationGroup. До использования этого даже ModalPopup не показывался. - person Zeeshanef; 21.02.2014

Я бы попробовал изменить это:

<input id="popupDummy" runat="server" style="display:none" />

к чему-то вроде этого:

<asp:Button id="popupDummy" runat="server" CausesValidation="false" Visible="false" />

Бьюсь об заклад, нетипизированный ввод требует проверки.

person Aaron Daniels    schedule 23.09.2009

у меня была та же проблема, добавление ValidationGroup к элементам управления проверкой сделало свое дело!

person Madam Zu Zu    schedule 14.03.2013

Еще одна вещь, которую стоит попробовать: если вам не нужен клиентский скрипт, вы можете отключить его в разметке. Это устранило нашу проблему.

EnableClientScript="false"
person Adrian    schedule 24.02.2014