Hom*_*mam 13 asp.net postback updatepanel
在一个页面中包含两个UpdatePanels,我怎么知道哪个UpdatePanel部分原因PostBack?
我的意思是在Page_Load事件处理程序中.
这是我的代码:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"
onprerender="UpdatePanel1_PreRender">
<ContentTemplate>
<A:u1 ID="u1" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"
onprerender="UpdatePanel2_PreRender">
<ContentTemplate>
<A:u2 ID="u2" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
我尝试了这段代码,但它并没有用到!
protected void Page_Load(object sender, EventArgs e)
{
if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack)
{
if (UpdatePanel1.IsInPartialRendering)
{
// never enter to here
}
if (UpdatePanel2.IsInPartialRendering)
{
// neither here
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助!
Fré*_*idi 11
您可以使用UpdatePanel类的IsInPartialRendering属性来确定特定面板是否导致部分回发:
protected void Page_Render(object sender, EventArgs e)
{
if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) {
if (yourFirstUpdatePanel.IsInPartialRendering) {
// The first UpdatePanel caused the partial postback.
} else if (yourSecondUpdatePanel.IsInPartialRendering) {
// The second UpdatePanel caused the partial postback.
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:似乎IsInPartialRendering总是false在Render阶段之前.由于您在Load阶段期间需要该信息,因此无法按预期工作.看到这个bug.
这里记录了一个解决方法,包括从中UpdatePanel获取自己的类以访问其受保护的RequiresUpdate属性:
public class ExtendedUpdatePanel : UpdatePanel
{
public bool IsUpdating
{
get {
return RequiresUpdate;
}
}
}
Run Code Online (Sandbox Code Playgroud)
更换后asp:UpdatePanel用ExtendedUpdatePanel在你的页面的标记,上面的代码变成:
protected void Page_Load(object sender, EventArgs e)
{
if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) {
if (yourFirstUpdatePanel.IsUpdating) {
// The first UpdatePanel caused the partial postback.
} else if (yourSecondUpdatePanel.IsUpdating) {
// The second UpdatePanel caused the partial postback.
}
}
}
Run Code Online (Sandbox Code Playgroud)
试试这个:
ScriptManager.GetCurrent().AsyncPostBackSourceElementID
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您不想扩展原始UpdatePanel类,也可以使用此解决方法:
string id = ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID;
Run Code Online (Sandbox Code Playgroud)
因此,您可以检查结果id并添加一些条件子句以确定应执行哪些代码.此id应该等于通过javascript函数传递的第一个参数__doPostBack('someid', '').
例如,我的更新面板中有一个用户控件:此控件包含一组触发UpdatePanel的链接按钮.)我也可以从一些外部链接手动更新此面板(使用类似的东西) __doPostBack('myUpdatePanelClientId', '');
也就是说,就我而言,我看到了加载UpdatePanel的三种不同方式:
每个场景给我一个不同的身份.第一个给我一个空字符串(因为这是第一个页面加载,还没有用__doPostBack函数触发任何回发.)
第二个给了我在用户控件中推送的按钮的UniqueId(这是原始和预期的ASP.NET行为.)
第三个给出了我在编码方法时传递的第一个参数(即:UpdatePanel的ClientId).
以下是我成功实现UpdatePanel用例的方法(假设我使用的是部分呈现模式.)这并不完美,但它可以按预期工作.
protected void myUpdatePanel_Load(object sender, EventArgs e)
{
string id = ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID;
bool firstLoad = (String.IsNullOrEmpty(id));
bool triggerFromUpdatePanel = !firstLoad && (id.Contains(userControlInsideMyUpdatePanel.UniqueID));
bool triggerFromExternalControl = !firstLoad && (id == myUpdatePanel.ClientID);
// case 1, 2, 3.
if ((firstLoad) || (triggerFromUpdatePanel) || (triggerFromExternalControl ))
{
// do something
}
else
{
// do nothing!
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12430 次 |
| 最近记录: |