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"列表,我只想更新一个部分,而不必进行不必要的循环。
有趣的是:如果我删除母版页,它就可以了!但是有了主页,它就没有了,为什么
您需要使用服务器控件来启动更新,而不是使用普通的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>