下拉列表(在更新面板中)导致完全的后台提交!

11

我在使用AJAX和ASP.NET 3.5时遇到了问题 :(

问题非常奇怪,因为我在不同的页面上使用相同的方法时是正常工作的,但在这个特定页面上却无法正常工作。

以下是我的代码:

    <asp:UpdatePanel ID="upMain" runat="server" UpdateMode="Conditional" Visible="true" RenderMode="Inline">
                <ContentTemplate>
<asp:DropDownList ID="ddlNewService_PortTelco" runat="server" Width="250" CssClass="dropdown" AutoPostBack="true" OnSelectedIndexChanged="Provision_PortedTelcoChanged"></asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
在DropDown之前有一个DIV(html标签),然后还有几个asp:Panels。我不明白为什么这会导致完整的POST BACK?!你有什么想法吗?谢谢
11个回答

20

我遇到了同样的问题...虽然这里复制的代码没有显示,但请确保您在updatepanel中没有任何使用ClientIDMode=Static的控件....将它们改为inherit

至少要检查可能会触发回发的任何控件。


1
我遇到了与OP描述的完全相同的问题,我的下拉列表也使用了ClientIDMode="Static"。移除ClientIDMode就解决了问题!如果你没有提到这个,我是不会发现的! - Kagawa
1
转换为继承可能不足够。如果应用程序默认或父级是静态的ClientMode,则继承无法解决问题。必须将其设置为AutoIDPredictable,以确保生成正确的clientID。 - Nuno Agapito
这也是我的问题!哦,天啊,那个不明显。谢谢! - n8wrl
或者您可以使用ClientIDMode="Static"为这些下拉列表手动添加AsyncPostBackTriggers。 - Sebazzz

5

我遇到了同样的问题...

请检查您的WEB.CONFIG文件

<xhtmlConformance mode="Legacy"/>

针对这一行.. 直接删除它!

对我有用。谢谢 http://andrew-murphy.co.uk/?p=152


5

您的下拉列表设置了AutoPostBack=true。这就是为什么它会进行回发而不是AsyncPostBack,如果这不是您想要的结果。

请从下拉列表中移除AutoPostBack=true,并为您的UpdatePanel设置一个异步触发器,该触发器设置为下拉列表及其事件名为SelectedIndexChanged


2
将AutoPostBack属性设置为true应该足以引起部分回发,但实际情况并非如此,正如您所描述的那样,触发了完整的回发。
以下解决方法适用于我:
1. 删除AutoPostBack属性。 2. 使用“onchange”客户端事件触发回发。
这就是原始DropDownList应该看起来的样子:
<asp:DropDownList ID="ddlNewService_PortTelco" runat="server" Width="250" CssClass="dropdown" OnChange="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(this.name, '', true, '', '', false, true))" OnSelectedIndexChanged="Provision_PortedTelcoChanged"></asp:DropDownList>

有关WebForm_PostBackOptions参数的更多详细信息,请参见以下内容:

function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)

http://msdn.microsoft.com/en-us/library/system.web.ui.postbackoptions_members(v=VS.90).aspx


2
如果您有一些带有Autopostback="true"ClientIdMode="Static"的asp组件,您需要使用触发器。

像这样:

<asp:UpdatePanel ID="upPrinceOffuce" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlPrintOffice" EventName="SelectedIndexChanged" />
    </Triggers>
    <ContentTemplate>
         <asp:DropDownList ID="ddlPrintOffice" runat="server" ClientIDMode="Static" AutoPostBack="true" ...blah blah
</asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>

当我使用触发器时,它找不到下拉列表(DropDownList)... http://stackoverflow.com/questions/30352866/how-to-prevent-full-page-postback-on-selectedindexchange-for-dropdownlist - SearchForKnowledge

2

抱歉我的编程技能不足 :| 一直都是正常工作的,但是因为其中一个操作页面“看起来”像是已经提交了POST请求,实际上并没有。太遗憾了!!!

对于浪费您的时间感到抱歉!


2
你可以在这里确定页面是否进行了完整的PostBack或部分PostBack:https://dev59.com/questions/ZHDYa4cB1Zd3GeqPDLLM - Chani Poz

1
你如何绑定DropDown?你提供的代码在我的环境中可以处理静态项目。也许是其他控件引起了问题。
我注意到你的UpdatePanel已经将其UpdateMode属性设置为conditional,但是你没有定义任何触发器。你可以尝试明确设置当你的dropdown触发selectedIndexChanged事件时更新面板应该执行异步回发。你可以使用类似以下标记:
<asp:UpdatePanel ID="upMain" runat="server" UpdateMode="Conditional" Visible="true"
    RenderMode="Inline">
    <ContentTemplate>
        <asp:DropDownList ID="ddlNewService_PortTelco" runat="server" Width="250" 
            AutoPostBack="true" OnSelectedIndexChanged="Provision_PortedTelcoChanged">
        </asp:DropDownList>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlNewService_PortTelco" EventName="SelectedIndexChanged" />
    </Triggers>
</asp:UpdatePanel>

嗨!感谢您的回复。我也尝试添加了AsyncPostBack触发器,但是没有帮助。在我的例子中并没有这个,因为据我所知,如果一个对象引起更新是在Update Panel内部,那么您不需要指定触发器。触发器仅在UpdatePanel外部的对象需要时才需要。 我尝试将UpdateMode更改为Always,但也没有帮助。 我已经在处理代码,并注意到当我在这个之后创建另一个UpdatePanel,并在其中添加相同的代码时,它能够正常工作:/ 所以,这个UpdatePanel中一定有些东西使它无法正常工作。 - user259119

1

将AutoID值设置为ClientIDMode属性。对我有用。在不同的浏览器中(如Google Chrome和Firefox),我遇到了不同的行为。


如果您在使用更新面板中的Bootstrap Select(下拉列表)时遇到此问题,这是一个解决方案。 - Leo

0
解决此问题的一种替代方法是:
声明库。
using AjaxControlToolkit;

然后您可以在这些行上执行一些操作

private void InitControl()
{        
            //FIX - DROP DOWN
            ToolkitScriptManager scrManager = (ToolkitScriptManager)Page.Master.Controls[0].Controls[0].FindControl("manScript");
            scrManager.RegisterAsyncPostBackControl(ddlNewService_PortTelco);
}

找不到 AjaxControlToolkit - SearchForKnowledge

0

当Dropdownlist的Autopostback属性设置为true时,遇到了同样的问题,并通过将dropdownlist ID添加到updatepanel触发器来解决了该问题。


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