Modalpopupextender и запятые, появляющиеся в моем текстовом поле asp.net

Некоторые странные вещи происходят, я конвертирую приложение, которое использовало javascript для открытия другой веб-страницы в крошечном окне для ввода данных для использования ModalPopupExtender.

Кажется, что все нормально, но в событии OK, когда я делаю txtData.Text(текстовое поле в моем модальном всплывающем окне), он возвращается с запятой перед данными, поэтому, если вы наберете "Rabbit", как "Кролик".

Также, когда я использую его несколько раз, в другом месте, где я мог бы щелкнуть, чтобы показать его, и наберите "Fish", он начнет возвращаться с такими вещами, как ", Rabbit, Fish"

Я не знаю, почему и как остановить это от каких-либо идей?

Ответ 1

По какой-то причине это не происходит, если для текстового поля установлено значение ReadOnly.

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

Все еще немного беспорядочно, но я не могу вернуться к майскому выпуску, потому что в этом выпуске есть еще одна ошибка с ComboBox, которую мне нужно избегать!


UPDATE:

Как немного фона, у меня есть пользовательский элемент управления (ascx) внутри моего модального всплывающего окна, потому что мне нужно его повторно использовать. Ascx должен обрабатывать сам пользовательский ввод (содержащая страница не знает, что происходит внутри элемента управления), поэтому, когда пользователь нажимает кнопку, я делаю обратный вызов и обрабатываю данные. Если успешный результат возвращается в функцию обратного вызова клиента, я имитирую щелчок того, что думает содержащая страница, является кнопкой "ОК", которая фактически невидима для пользователя.

Я изменил свой код, чтобы добавить скрытое текстовое поле readonly и скопировать текст из исходного текстового поля в новый каждый раз, когда текст изменится.

    <asp:TextBox runat="server" ID="txtName"></asp:TextBox>

становится

    <asp:TextBox runat="server" ID="txtName" onchange="document.getElementById(this.id + 'RO').value = this.value"></asp:TextBox>
    <asp:TextBox runat="server" ID="txtNameRO" ReadOnly="true" style="display:none;"></asp:TextBox>

то при передаче значений обратно в обратном вызове вместо получения значения txtName я использую txtNameRO.

Я не думаю, что это поможет, если вы делаете обратную передачу, но вы можете добавить обратный вызов перед обратной передачей, как у меня. Надеюсь, это все равно поможет кому-то!

Ответ 2

То же самое здесь. Не знаю, почему это происходит. Каждый postback, инициированный кнопками внутри панели, добавляет запятые и предыдущие значения ко всем текстовым полям.

Включение в TextBox.Text setter показало, что поврежденные данные поступают из коллекции postdata. Таким образом, это означает, что перед обратной передачей модуль ModalPopupExtender повреждает данные.

P.S. Я не использую UpdatePanel, но регулярную панель, поэтому никаких триггеров, связанных с кнопками, нет.

Обновлено: Решение найдено.

Проблема, кажется, исчезает при откате в майский выпуск AjaxToolKit (http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326).

Ответ 3

Я также нашел форум, указывающий, что это может быть стандартное поведение html, если в форме с одним именем есть несколько элементов управления. Это имеет в виду (и предполагая, что в элементах управления ajax есть ошибка). Кодирование, которое я кодировал вокруг, было добавить в свой Page_Load следующий вид оператора для каждого из моих текстовых полей.

string [] vals = txtValue.Text.Split(Convert.ToChar( "," )); txtValue.Text = vals [vals.Length - 1];//Похоже, что мое последнее значение всегда находилось в последнем элементе

Так как загрузка формы происходит до события кнопки, я сортирую свои поля, прежде чем они попадают в событие, которое имеет дело с их значениями.

Ответ 4

У меня была аналогичная проблема, с диалогом jQuery внутри UpdatePanel. Как я мог читать на разных сайтах, проблема вызвана дубликатами внутри дерева DOM.

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

var count = $(".dialog").length;
for (i = 1; i < count; i++) {
    $(".dialog").first().remove();
}

EDIT: оказалось, что это не так просто. В конце мой код выглядел так:

В готовом документе (а также асинхронные вызовы страниц):

function AddDialog() {

    var dlg = $(".dialog").dialog({ autoOpen: false });
    dlg.parent().appendTo($("form:first"));

    var targetSelector = ".myDialog"; // watch out: can't use ID here!

    if (mustOpenDialog) {

        $(targetSelector).last().remove();  //-- remove last copy

        var dlg = $(targetSelector).dialog({ autoOpen: true });

        var count = $(targetSelector).length;
        for (i = 1; i < count; i++) {
            $(targetSelector).last().remove();
        }
    }

    if (mustCloseDialog) {

        $(targetSelector).dialog("close");
        var count = $(targetSelector).length;
        for (i = 1; i < count; i++) {
            $(targetSelector).first().remove();
        }
    }

}

В моем полном коде mustOpenDialog и mustCloseDialog установлены в codebehind.

Ответ 5

Просто поделитесь этим решением с каждой проблемой. Старайтесь не использовать asp control вместо html.

*<input type="text" id="txtID" runat="server" class="myClass" />*

это отлично работает для меня.

Спасибо,

Ответ 6

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

С наилучшими пожеланиями - Тобиас

Ответ 7

Мой ответ был похож на Smarty's. Моя страница выглядела так:

<UpdatePanel>
    <GridView>
        <Button> <-- These buttons fire modal popup programmatically.
        <Button>
        <Button>
    </GridView>
    <ModalPopup>
    <HiddenField> <-- Dummy target of modal popup.
</UpdatePanel>

Исправление должно было изменить его на это...

<UpdatePanel>
    <GridView>
        <Button> <-- These buttons fire modal popup programmatically.
        <Button>
        <Button>
    </GridView>
</UpdatePanel>
<ModalPopup>
<HiddenField> <-- Dummy target of modal popup.

Мне пришлось регистрировать каждую кнопку в качестве элемента управления обратной связью с помощью scriptmanager в событии rowdatabound gridview. С другой стороны, у меня больше полных обратных ссылок. Но он решил проблему.

Ответ 8

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

Откройте элемент управления пользователя внутри диалогового окна jquery при нажатии кнопки. У этого пользовательского элемента управления есть панель обновления внутри него и несколько текстовых полей. В первый раз откройте диалог, он работал как шарм. При последующих щелчках, чтобы открыть диалог, я заметил странное поведение. У меня было немного текстовых полей внутри пользовательского элемента управления (внутри панели обновления). На любой частичной обратной почте текст текстовых полей изменился на current text, current text. Если значение текстового поля было fish, то при любых частичных обратных передачах его значение изменилось на fish, fish.

Причиной этого я пользовался jquery, чтобы открыть диалог. Я также добавил диалоговое окно для создания клика по кнопке.

 dlg.parent().appendTo($('form:first'));

Таким образом, при последующем щелчке нескольких элементов управления пользователя, которые добавлены в DOM и, следовательно, при построении данных обратной записи, существовало более одного элемента управления с одним и тем же идентификатором и, следовательно, там, где они добавлены с использованием "," - запятой.

Итак, мое решение было простым, закрыв диалог, я просто удалил его из DOM

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

Ответ 9

Я успешно реализовал полный хак, основанный на реакции Джен. Я использую asp: HiddenField для хранения значения, которое я хочу отправить назад, и заполняю его явным полем ввода HTML

<asp:HiddenField ID="txt" runat="server"/>
<input type="text" onchange='document.getElementById("<%= txt.ClientID %>").value = this.value;' />

Это более легкий вес, чем решение Jen, поскольку вы по-прежнему отправляете только один серверный контроль.

Кстати, это очень значительная ошибка в Ajax Toolkit. Вы можете проголосовать и прокомментировать это здесь:

Ошибка CodePlex

Притворись, что ты в Чикаго. Голосовать рано, часто голосовать.

Ответ 10

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

Ответ 11

Я пытаюсь решить это уже целый день, и у очень полезного человека в моем офисе появилось потрясающее решение!

Мы переместили ModalPopUpExtender и последующую панель всплывающих окон, контролируемую расширителем, чтобы использовать внешний файл UpdatePanel на странице, создали поддельную кнопку и указали идентификатор поддельной кнопки на свойство TargetControlID для ModalPopUpExtender.

<asp:Button runat="server" ID="dummyButton" CausesValidation="false" Style="display: none" />

<cc1:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="dummyButton" CancelControlID="CancelPopUp" PopupControlID="PanelID" BackgroundCssClass="modalBackground" />

Внутри моих форм/страниц, где раньше были расширения и панели PopUp, я создал событие OnClick на кнопке, которую мы использовали для запуска ModalPopUpExtender.

<asp:ImageButton ID="ButtonID" runat="server" Text="Add" ImageUrl="~/Images/Add-32-1-small.png" OnClick="LoadPopUp" />

На моей кнопке, запускающей ModalPopUpExtender, я создал событие OnClick под названием "LoadPopUp" - в LoadPopUp в коде позади я просто поместил ModalPopUpExtender1.Show();

protected void LoadPopUp(object sender, EventArgs e)
{
  ModalPopupExtender1.Show();
}

Ответ 12

У меня была такая же проблема, за исключением того, что я не использую панели AjaxControlToolkit или обновления. Моя проблема была решена путем перемещения тега <form> с главной страницы ASP.net на страницу с текстовыми полями. Может помочь кому-то.

Ответ 13

имеет такую ​​же проблему, и я нашел решение здесь: http://ajaxcontroltoolkit.codeplex.com/workitem/26259

Проблема заключается в последней версии ajax, просто установите версию ajax 2009 года, и modalpopup отлично справится с вашим фактическим кодом.

Задача проверки и согласования в отношении ссылки. El problema viene con las versiones recientes de ajax, simplemente instala la version del año 2009 y el modalpopup funcionará bien con tu código actual.

Ответ 14

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