ModalPopupExtender和逗号出现在我的TextBox中(ASP.NET)。

12

一些奇怪的事情正在发生,我正在将一个以前使用JavaScript打开另一个网页进行数据输入的应用程序转换为使用ModalPopupExtender。

看起来它工作得很好,但在OK事件中,当我执行txtData.Text (我的模态弹出窗口中的文本框)时,它会在数据前面加上逗号,所以如果你输入"Rabbit",它会返回",Rabbit"。

此外,当我在其他可能会点击显示该模态弹出窗口的地方多次使用它时,当我输入"Fish"时,它开始返回一些像",Rabbit,,Fish"之类的东西。

我不知道为什么或如何停止它做这些事情...有什么想法吗?


1
遇到了完全相同的问题。这似乎是因为我们更新到最新版本的AJAX控件工具包。还会导致随机错误,例如每个页面上的ajax控件/扩展器都会出现消息:Sys.InvalidOperationException: 无法将具有相同id '[ExtenderID]'的两个组件添加到应用程序中。 - user193051
最终我没有找到解决方案,所以最后修改了我的页面,使用 Javascript 来隐藏和显示模态对话框,并且不再使用 UpdatePanel 而是进行整个页面刷新... 真糟糕! - NibblyPig
15个回答

4
同样的问题,不知道为什么会发生。面板内按钮引发的每个后台提交都会向所有文本字段添加逗号和先前的值。
通过钩入TextBox.Text setter,发现损坏的数据来自postdata集合。这意味着在后台提交之前,ModalPopupExtender会破坏数据。
附注:我没有使用UpdatePanel,而是常规面板,因此没有与按钮相关联的触发器。
更新:找到解决方案。
当回滚到AjaxToolKit的五月发布版时(http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326),问题似乎就会消失。

非常感谢。回滚到五月的版本发布起作用了。 - kentchen
天啊!太感谢了——这让我快疯了。 - Cᴏʀʏ

4

我想分享一个解决这个问题的方法。尝试不要使用ASP控件,而是使用HTML。

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

这对我来说很好用。

谢谢,


3

我遇到了类似的问题,将jQuery Dialog放在UpdatePanel中。根据不同网站上的阅读,这个问题是由于DOM树中存在重复元素引起的。

最终,我找到了一个非常简单的解决方案。我将对话框分配给div,然后通过JavaScript打开或关闭它,然后运行这段小代码来删除重复项:

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

编辑:结果并不是那么简单。最终,我的代码如下:

在文档准备好时(以及异步页面调用时):

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是在后端代码中设置的。

1
在jQuery对话框中,一种解决方案是在创建对话框时定义“关闭”事件,并在其中销毁对话框。像这样: close: function (event, ui) { $(this).dialog('destroy').remove(); } - Mee

3
我还发现一个论坛,指出当表单中有多个控件名称相同时,这可能是标准的HTML行为。考虑到这一点(并假设ajax控件存在错误),我编写代码时为每个文本框添加以下类型语句以解决它。
string[] vals = txtValue.Text.Split(Convert.ToChar(",")); txtValue.Text = vals[vals.Length - 1]; //看起来我的最新值总是在最后一个项目中
由于表单加载发生在按钮事件之前,因此我会在它们到达处理其值的事件之前对自己的字段进行排序。

对我来说,关于多个表单元素的声明是关键。我在页面上有一个jQuery UI对话框,在切换到使用异步回发后,表单将被复制到对话框中,但不会被删除。当我在回发之前删除表单时,就不再获得逗号分隔的值了。 - Sam Sussman

2
这是一个比较晚的回复,但我在这里记录下来以便其他人受益。 我的情况是,在按钮点击时在jquery对话框中打开用户控件。该用户控件内部有一个update panel和几个文本框。第一次打开对话框时,它表现得很好。但在随后的点击中打开对话框时,我注意到了奇怪的行为。我在用户控件内部(update panel内部)有几个文本框。在任何部分性回发上,文本框的文本会更改为“当前文本,当前文本”。如果文本框的值为“fish”,则在任何部分性回发后,其值都会更改为“fish,fish”。 造成这种情况的原因是我在使用jquery打开对话框时,还将对话框附加到了表单上。
 dlg.parent().appendTo($('form:first'));

在后续的点击中,多个用户控件被添加到DOM中,因此在构建回发数据时,存在具有相同ID的多个控件,因此它们的值使用“,”逗号进行了附加。

所以我的解决方案很简单,在关闭对话框时,我只是将其从DOM中删除。

我从以下链接中得到提示。在此发布以供将来参考 这里


那个链接已经失效了。你能发更多的代码吗? - Adam Mendoza

2

我的回答与Smarty的类似。我的页面看起来像这样...

<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.

我必须在gridview rowdatabound事件中,将每个按钮都注册为一个postback控件,并使用scriptmanager。不过缺点是我有更多的完整的postbacks。但是这种方法解决了问题。


2

我曾经遇到一个问题,就是之前的数据返回时被逗号隔开。这似乎是因为我的“确认”按钮在更新面板中,并且我也把它放在了触发器部分。将该按钮从更新面板的触发器部分移除,问题得以解决。

最好的问候 - Tobias


1
我曾遇到过这个问题,花了很多时间才发现原因是由于我在更改标记时忘记删除一个额外的标签。请确保在.aspx页面上所有标记都正确对齐。
<div>
   **Lots of code here**
   </div> <-- That guy owes me a vacation!
</div>

你节省了我大量的调试时间。 - Firas Shrourou

1

由于某些原因,如果文本框设置为只读,似乎不会发生此问题。

我想可以通过向用户显示可编辑的文本框,并捕获它的按键输入,并更新一个对用户隐藏的只读文本框来解决此问题。

仍然有点凌乱,但我无法回滚到五月份的版本,因为该版本中还存在另外一个下拉列表框的错误,我需要避免!


更新:

背景:我在模态弹出窗口中使用了一个用户控件(ascx),因为我需要重用它。该ascx必须自己处理用户的输入(包含页面不知道控件内部发生了什么),所以当用户单击按钮时,我会进行回调并处理数据。如果客户端回调函数返回成功结果,则我会模拟单击包含页面认为是“确定”按钮的按钮,但对用户来说实际上是不可见的。

我已更改代码,添加了一个隐藏的只读文本框,并在每次文本更改时将文本从原始文本框复制到新文本框中。

    <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>

然后在回调中将值传回时,我使用txtNameRO而不是获取txtName的值。

如果您正在执行回发操作,我认为这并不会有所帮助,但是您可以像我一样在回发之前添加一个回调。希望这能对某些人有所帮助!


0

我已经成功地基于Jen的回复实现了一个完整的黑客。我使用asp:HiddenField来保存我想要提交的值,并使用纯HTML输入框填充它。

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

这比Jen的解决方案更轻量级,因为您仍然只需提交一个服务器控件。

顺便说一下,这是Ajax Toolkit中非常重要的错误。您可以在此处投票并发表评论:

CodePlex Issue

假装你在芝加哥。早投票,多投票。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接