我有一个具有多个更新面板的用户控件
在页面加载时,我将子用户控件动态加载到PlaceHolder上(我每次都这样做,不检查回发)
我希望能够维护用户在Child用户控件中所做的更改的状态。 (子用户控件具有html控件以及asp.net控件和其他自定义控件)。
只要点击按钮A或B导致回发,子用户控件就会丢失状态。 UpdatePanels的模式已设置为条件。
在OnPageLoad中,
我想防止这种情况发生。
这是ASPX页面的HTML结构
<UpdatePanel1>
<UpdatePanelChild1>
<Button A>
<Button B>
</UpdatePanelChild1>
<UpdatePanelChild2>
<PlaceHolderA>
</UpdatePanelChild2>
答案 0 :(得分:1)
动态添加控件时,每次页面加载时都需要重新添加控件。我必须解决类似的困难,我这样做有两种方式。在动态字段添加的情况下,我会在用户点击填充或自行添加之前向页面添加隐藏控件。通过创建这种占位符,系统可以开始正确地处理视图状态,这样可以保留用户的更改。我听到你提到的第二个问题是chich更新面板更新可能存在问题。可以将它们设置为有条件的代码,如果需要代码,也可以在rpanel中触发更新。它只是updatepanel#.update()
或者您也可以将所有更新面板包装在另一个面板中,但我建议不要这样做,因为它会浪费资源。
答案 1 :(得分:1)
看起来您正在丢失动态添加的子控件的ViewState。
这是因为您在页面生命周期中添加太晚了:在Page.Load事件之前加载了ViewState。
尝试在Page.Init中添加您的子控件。
答案 2 :(得分:0)
您可以在控件中使用带有表单runat服务器的ScriptManager,而不是更新面板。
这样你就没有回帖了。
这是一个很好的参考:http://www.asp.net/Ajax/Documentation/Live/overview/ScriptManagerOverview.aspx
问候。 Josema。 http://www.learning-workshop.com
答案 3 :(得分:0)
块引用 // Asp.Net代码中的代码
<form runat="server" id="form1">
<asp:ScriptManager id="ScriptManager1" runat="server" >
<Services>
<asp:ServiceReference Path="/WebServices/MyService.asmx"/>
</Services>
</asp:ScriptManager>
</form>
<script language="javascript" type="text/javascript">
//call with namespace "WebSite" included
WebSite.WebServices.HelloWorld(EndHelloWorld);
function EndHelloWorld()
{
//do whatever
}
</script>
</form>
块引用 // Web服务类中的代码
[ScriptService]
public class MyService : System.Web.Services.WebService
{
[WebMethod]
public void HelloWorld()
{
return "Hello world";
}
}
从我的页面脚本中我将对我的web服务进行Ajax,并且回调EndHelloWorld你可以做任何事情而不会失去状态。
希望它有所帮助...... 亲切的问候。 Josema。
答案 4 :(得分:0)
看起来您需要删除嵌套的UpdatePanels。在这样的结构中:
<ParentUpdatePanel>
<ChildUpdatePanel1 />
<ChildUpdatePanel2 />
</ParentUpdatePanel />
即使子UpdatePanels设置为条件,所有更新面板也将一直更新,因为父实际上是更新的。因此,其中一个子项中的回发事件将导致父级更新。
使用这种类型的模式通常很糟糕......如果你需要一个UpdatePanel中的事件导致另一个更新,你应该这样做:
<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="buttonA" runat="server" />
<asp:Button ID="buttonB" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="up2" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Placeholder ID="ph" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="buttonB" EventName="Click" />
</Triggers>
</asp:UpdatePanel>