updatepanel更新整个页面而不仅仅是contenttemplate

时间:2013-02-14 09:27:00

标签: c# asp.net .net

                        <%@ 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”列表,我只想更新一个部分而不必进行不必要的循环。

以下是有趣的部分:如果我删除了主页,它就可以了!但是对于主页,它不是,为什么?!

8 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

UpdateMode模式属性设置为Conditional。 UpdateMode的默认值为Always,如果UpdateMode属性设置为Always,则UpdatePanel控件的内容会在源自页面上任意位置的每个回发时更新,reference

编辑:您正在使用输入类型=“提交”,这可能导致帖子用asp:Button替换它以使ajax调用起作用。

答案 2 :(得分:2)

这种行为的原因是你使用普通的html提交按钮而不是ASP.NET服务器按钮。因此页面提交给服务器而不涉及ASP.NET Ajax功能。用asp:Button control

替换ActivitySubmit按钮

答案 3 :(得分:1)

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

答案 4 :(得分: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及以上,这将有效。然而,在较低版本中,它不会。我担心我无法弄清楚如何在较低版本中修复它。 :(

答案 5 :(得分:0)

Page标记中添加

ClientIDMode="AutoID" 

答案 6 :(得分:0)

我认为您可以尝试将表单放在updatepanel中,或者您可以尝试将子项更改为updatepanel的触发器属性,如下所示:

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

然后将按钮添加为触发器,如此

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

答案 7 :(得分:0)

尝试将此部分添加到您的UpdatePanel:

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