modalpopupextender和逗号出现在我的文本框asp.net中

时间:2009-10-19 10:50:41

标签: asp.net modalpopupextender

一些奇怪的事情正在发生,我正在转换一个过去常常使用javascript的应用程序在一个小窗口中打开另一个网页,以便输入数据以使用ModalPopupExtender。

它似乎工作正常,但在OK事件中,当我执行txtData.Text(我的模态弹出窗口中的文本框)时,它在数据之前返回一个逗号,所以如果你键入“Rabbit”,它会来回到“,兔子”。

当我多次使用它时,在我可能点击显示它的另一个地方,并输入“Fish”,它会开始回复“兔子,鱼”这样的东西

我不知道为什么或如何阻止它做这个...任何想法?

14 个答案:

答案 0 :(得分:4)

同样在这里。不知道为什么会发生这种情况。由面板中的按钮启动的每个回发都会将逗号和先前值添加到所有文本字段中。

挂钩TextBox.Text setter显示损坏的数据来自postdata集合。所以这意味着在回发之前,ModalPopupExtender会破坏数据。

P.S。我没有使用UpdatePanel,而是使用常规Panel,因此没有与按钮关联的触发器。

更新:找到解决方案。

回滚到May发布的AjaxToolKit(http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326)时,问题似乎消失了。

答案 1 :(得分:4)

只需将此解决方案分享给每个人。尽量不要使用asp控件而是使用html。

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

这对我来说很好。

谢谢,

答案 2 :(得分:3)

我还找到了一个论坛,表明当表单上有多个具有相同名称的控件时,它可能是标准的html行为。考虑到这一点(并假设ajax控件中存在错误)我编写的方法是在我的Page_Load中为每个文本框添加以下类型的语句。

string [] vals = txtValue.Text.Split(Convert.ToChar(“,”)); txtValue.Text = vals [vals.Length - 1]; //看来我的最新值总是在最后一项中

由于表单加载发生在按钮事件之前,我在对其处理其值的事件进行排序之前对其进行排序。

答案 3 :(得分:3)

我有一个类似的问题,在UpdatePanel中有一个jQuery Dialog。正如我可以在不同的网站上阅读,问题是由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。

答案 4 :(得分:2)

我遇到了同样的问题,之前的值以逗号分隔。似乎我的确定按钮位于更新面板内,我在触发部分也有它。从updatepanel的触发器部分删除按钮解决了这个问题。

最好的问候 - 托比亚斯

答案 5 :(得分: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事件上使用scriptmanager将每个按钮注册为回发控件。不好的一面是我有更多完整的回发。但是,它解决了这个问题。

答案 6 :(得分:1)

由于某些原因,如果文本框设置为ReadOnly,似乎不会发生。

我认为可以通过向用户显示可编辑的文本框,捕获键盘以及更新对用户隐藏的只读文本框来解决此问题。

仍然有点混乱,但我无法回滚到May的发布,因为该版本中还有另一个我需要避免使用ComboBox的错误!


更新:

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

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

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

如果您正在进行回发,我认为这不会有所帮助,但您可以像我一样在回发之前添加回调。希望这对任何人都有帮助!

答案 7 :(得分:0)

我已根据Jen的回复成功实施了完整的黑客攻击。我使用asp:HiddenField来保存我想要发回的值,并使用纯HTML输入框填充它

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

这比Jen的解决方案重量轻,因为你仍然只回发一个服务器控件。

BTW,这是Ajax Toolkit中一个非常重要的错误。你可以在这里投票和评论:

CodePlex Issue

假装你在芝加哥。提前投票,经常投票。

答案 8 :(得分:0)

对我来说,解决方案是从主更新面板中取出模态poup。一旦我这样做,逗号便消失了。如果你真的需要在模态弹出窗口内部有一个更新面板,那么在该面板中创建一个更新面板 我不需要回滚到以前版本的工具包。

答案 9 :(得分:0)

我一直在努力解决这一问题,而且我办公室里一些非常有帮助的人提出了一个很棒的解决方案!

我们将由扩展程序控制的ModalPopUpExtender和后续弹出面板移动到页面最外面的UpdatePanel的外部,创建了一个假按钮,并将假按钮的ID提供给ModalPopUpExtender的TargetControlID属性。

<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的按钮上,我创建了一个名为“LoadPopUp”的OnClick事件 - 在后面的代码中的LoadPopUp中我只是简单地放了ModalPopUpExtender1.Show();

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

答案 10 :(得分:0)

除了我没有使用AjaxControlToolkit或更新面板外,我遇到了同样的问题。通过将<form>标记从ASP.net母版页移动到文本框所在的页面,我的问题得以解决。可以帮助别人。

答案 11 :(得分:0)

有同样的问题,我在这里找到了解决方案http://ajaxcontroltoolkit.codeplex.com/workitem/26259

问题是ajax的最后一个版本,只是INSTALL 2009年的ajax版本和modalpopup可以正常使用你的实际代码。

Tuve el mismo problemayencontrélasoluciónenel link que indico arriba。 El problema viene con las versiones recientes de ajax,simplemente instala la versiondelaño2009y elmodalpopupfuncionarábiencontucódigofual。

答案 12 :(得分:0)

解决方案是从主更新面板中取出模态弹出窗口。一旦这样做,逗号就会消失。如果您真的需要在模式弹出窗口内部使用更新面板,请在该面板中创建其中一个。

答案 13 :(得分:0)

我遇到了这个问题,并花了很多时间,发现这是由于隐藏了一个额外的标签导致的,我在更改标记时忘记删除了该标签。

确保在.aspx页上所有标记正确排列。

<div>
   **Lots of code here**
   </div> <-- That guy owes me a vacation!
</div>