updatepanel更新整个页面,而不仅仅是内容模板

本文关键字:不仅仅是 更新 updatepanel | 更新日期: 2023-09-27 17:59:16

                        <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2"  ClientIDMode="AutoID" %>
                        <asp:Content ID="Content1" ContentPlaceHolderID="head"        Runat="server">
                        </asp:Content>
                        <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="server">
                        <% 
                        foreach (var item in AllSales)
                        {
         //Here i have just set a breakpoint to see if it loops the AllSales list when I press the update button
                        }
                        %>
                        <asp:UpdatePanel runat="server" ID="UpdatePanel1">
                        <ContentTemplate>
                        <p>Update Panel: DateTime.Now: <%= DateTime.Now.ToString() %></p>
                        <asp:Button runat="server" ID="Submit" Text="Update" />
                        </ContentTemplate>
                        </asp:UpdatePanel>
                        </asp:Content> 

脚本管理器代码在母版页中:

    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
    </asp:ContentPlaceHolder>

这里的问题是,每次我点击更新按钮时,它都会再次加载页面并循环"AllSales"列表,我只想更新一个部分,而不必进行不必要的循环。

有趣的是:如果我删除母版页,它就可以了!但是有了主页,它就没有了,为什么

updatepanel更新整个页面,而不仅仅是内容模板

您需要使用服务器控件来启动更新,而不是使用普通的html输入按钮。尝试使用:

<asp:Button ID="ActivitySubmit" Text="Submit" runat="server" />

出现这种行为的原因是您使用了纯html提交按钮而不是ASP。NET服务器按钮。因此,页面提交到服务器而不涉及ASP。NET Ajax功能。用asp:button control 替换ActivitySubmit按钮

UpdateMode模式属性设置为Conditional。UpdateMode的默认值为Always。如果UpdateMode属性设置为Always,则UpdatePanel控件的内容将在从页面上任何位置发起的每次回发时更新,请参考

编辑:您使用的是inputtype="submit",这可能会导致post-back将其替换为asp:Button以使ajax调用正常工作。

我测试了相同的代码,只更改了按钮类型,它只刷新了更新面板的内容。问题是你的网站正在瞄准。NET 3.0,但您需要至少达到3.5。我在3.0上测试过,它不起作用,但在3.5和4.0上,它很好。因此,更简单、更安全的解决方案是以3.5为目标。但是如果你想使用。NET 3.0,我会尝试找到一个解决方法。请告诉我。

我试图重新创建您的问题,但在我的情况下,它运行良好。尝试创建一个新的.aspx文件并粘贴以下内容:

<!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">
    <div>
        <p>Outside UpdatePanel</p>
        <asp:ScriptManager runat="server" ID="ScriptManager1">
        </asp:ScriptManager>
        <asp:UpdatePanel runat="server" ID="UpdatePanel1">
            <ContentTemplate>
                <p>DateTime.Now: <%= DateTime.Now.ToString() %></p>
                <asp:Button runat="server" ID="SubmitButton" Text="Go" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

这在VS2010中使用进行了测试。NET 4.0在一个空的Web应用程序中。这对你也有用吗?我尝试了使用带有内容占位符的母版页的相同示例。这会产生相同(正常工作(的结果。从这一点我想你的页面上还有一些我们遗漏的东西。有吗?

[编辑]

我做了另一个简单的例子,这次是母版页和内容页。

主页面:

<!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">
    <div>
        <asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>
        <p>Master Page: DateTime.Now: <%= DateTime.Now.ToString() %></p>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"></asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

Aspx页面:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<p>Update Panel: DateTime.Now: <%= DateTime.Now.ToString() %></p>
<asp:Button runat="server" ID="Submit" Text="Update" />
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>

同样,在与另一个示例相同的环境中,这也可以毫无问题地工作。看来你得告诉我有关的事。NET框架,以及您在主页和aspx页面中设置的其他内容,因为:

在。Net 3.5及以上版本都可以。然而,在较低版本中,它不会。恐怕我一直想不出如何在较低版本中修复它(

Page标签中只需添加

ClientIDMode="AutoID" 

我认为您可以尝试将表单放入更新面板中,也可以尝试将子项更改为更新面板的触发器属性,如下所示:

<asp:UpdatePanel runat="server" ID="UpdatePanel1" ChildrenAsTriggers="False">

然后像这个一样添加按钮作为触发器

   ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(SubmitButton);

尝试将此部分添加到UpdatePanel中:

  <Triggers>
     <asp:AsyncPostBackTrigger ControlID="Submit" />
  </Triggers>