在.ascx文件中刷新内容

3
因为.ascx文件在页面生命周期的早期自然呈现,如果我想要更新在.ascx部分之外的表单信息,那么在按钮点击(保存信息的相同按钮)时,如何刷新.ascx文件以反映更改?
例如(伪代码):
Sub Page_load
    'user control is naturally rendered here'
End Sub

Sub Button_Click
    SaveStuff()
    ReRenderUserControl()
End Sub
3个回答

4
如果您正在创建一个基于保存数据构建的用户控件,您可以创建一个方法来执行该构建操作,然后在页面和用户控件中调用它(伪代码):
用户控件:
protected Page_Load(object sender, EventArgs e)
{
    BuildControlBasedOnData();
}

public BuildControlBasedOnData()
{
    // Build the user control based on saved data
} 

调用页面:

Button_Click(object sender, EventArgs e)
{
    UserControl1.BuildControlBasedOnData();    
}

3
用户控件(.ascx文件)在包含页面的生命周期中被呈现,正如您所提到的那样。当您在包含页面上进行按钮点击后回发时,在回发加载用户控件时将完全重新呈现。如果您需要在此加载时使用户控件包含不同的信息,则可以执行以下操作:
  • 在您的用户控件中,访问数据存储并返回所需信息,以便在其加载事件或任何其他适当事件(控件的数据绑定等)期间使用。
  • 在您的包含页面的Page Load中,为您在用户控件中使用的属性分配值。这些值可以来自数据存储、查询字符串或其他任何地方。
还有很多其他选项。如果您谈论部分回发或AJAX类型的内容,则可能需要使用JavaScript来更新用户控件的不同部分(除非您使用UpdatePanels,但您不应该这样做,因为它们是魔鬼)。

1
这并没有告诉我如何在 page_load 函数之外保存信息后重新渲染用户控件... - Jason

2
我想到了一个不完美但可用的解决方案。我只是将我的.ascx文件中的Page_Load函数改为Public,在保存信息后调用它就可以解决我的问题。
如果有更优雅的解决方案,请告诉我!

1
你不应该这样做。正如Phairoh在上面提到的,用户控件遵循包含页面的页面生命周期。您可以在呈现用户控件之前公开修改用户控件的公共属性和方法。 - CAbbott
我应该创建一个名为ReRender的公共方法,只需调用Page_load函数吗? - Jason
我修改了我的答案,以解决我认为你想要实现的内容。它基本上是用户控件中的公共方法,可以调用该方法来重新构建控件,以任何你想要的方式。 - CAbbott
你的修改基本上就是我所做的...只需创建一个公共方法来调用我的page_load函数。我更喜欢这个解决方案,因为它更符合逻辑。谢谢! - Jason
如果这是你喜欢的,那就好。但需要注意的是,如果您的 Page_Load 逻辑有所改变以处理与控件呈现无关的事情,那么在进行那些外部公共调用时可能会得到意想不到的结果。 - CAbbott
没错,这就是为什么我接受了你的答案。尽管现在我只需要页面加载函数,但以后可能还需要做其他事情。再次感谢 :) - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接