在更新面板中放置多个控件的正确方法是什么
本文关键字:控件 是什么 方法 更新 | 更新日期: 2023-09-27 18:29:08
我有一个注册表单,其中包含3到4个下拉控件和2个日期选择器,现在当下拉控件值被选中时(已选中的索引更改被触发)然后我不想回发我的页面。
我已经使用更新面板来阻止这种行为的帖子如下:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<%--Update Panel for date picker%>
<asp:UpdatePanel ID="UpdatePanelDatepicker" runat="server">
<ContentTemplate>
<telerik:RadDatePicker ID="rdpDate1" runat="server">
</telerik:RadDatePicker>
</ContentTemplate>
</asp:UpdatePanel>
<%--Update Panel for Dropdown--%>
<asp:UpdatePanel ID="updatepaneldata" runat="server">
<ContentTemplate>
<telerik:RadComboBox ID="ddlCountry" runat="server">
</telerik:RadComboBox>
</ContentTemplate>
</asp:UpdatePanel>
</ContentTemplate>
</asp:UpdatePanel>
所以我只想问一下,把多个控件放在更新面板下的正确方式是什么??
订阅客户端initializeRequest
的ajax事件。在这种情况下,如果需要,我们可以取消ajax回发。
initializeRequest方法是在异步请求的处理开始之前引发的。您可以使用此事件取消回发。
在这种情况下,我们将检查是否由于ddlCountry
而启动异步回发,如果是,则取消ajax回发,因此不会发生回发。
要解决您的问题,只需执行以下操作:将以下JavaScript添加到您的aspx页面在下面的代码中,当浏览器加载页面时,在加载了所有脚本以及创建了所有客户端对象之后,客户端的ASP.Net Framework会自动调用pageLoad
方法。
取消组合框的JavaScript返回
<script type="text/javascript">
function pageLoad()
{
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(CancelComboBoxPostback);
}
function CancelComboBoxPostback(sender, args)
{
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (prm.get_isInAsyncPostBack() & args.get_postBackElement().id == 'ddlCountry') {
args.set_cancel(true);
}
}
</script>
以下只是建议,而不是解决特定问题的一部分:此外,我建议远离nested update panels
,因为如果开发人员不知道嵌套的更新面板是如何工作的,这可能会导致意外的结果。在您的情况下,在下面的标记中,一个更新面板应该足够了,而不是在原始标记中使用的嵌套更新面板。
没有嵌套更新面板的标记
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<telerik:RadDatePicker ID="rdpDate1" runat="server">
</telerik:RadDatePicker>
<telerik:RadComboBox ID="ddlCountry" runat="server">
</telerik:RadComboBox>
</ContentTemplate>
</asp:UpdatePanel>
老实说,我发现的UpdatePanel
比它的价值更麻烦。
UpdatePanel
控件是中Ajax功能的核心部分ASP.NET。它们与ScriptManager控件一起使用以启用部分页面呈现。部分页面呈现减少了对当页面必须更新。部分页面呈现改善了用户体验,因为它减少了在全页回发并提高网页交互性。
我经常发现控件的实现会导致更多的问题,而这是不值得的。所以我经常实现自己的Ajax服务来处理这样的逻辑。你可以用老派的方法做这件事,很容易。
// Create .aspx page, to be our service.
public class ControlUpdateService
{
protected void Page_Load(object sender, EventArgs e)
{
// Use an approach to determine which control type, and model to build.
// You would build your object, then use Newtonsoft.Json, to serialize, then
// return the object, via Response.End(object).
}
}
然后,您的页面将Ajax数据,访问服务,然后通过Ajax调用中的.success
构建控件。如果您采用这种方法,那么您也将致力于通过Ajax保存数据。记住这一点。当我回答这个问题时,我忍不住觉得你的问题实际上源于控件执行AutoPostback
。你实际上可以禁用它。
AutoPostBack = "false";
Telerik可能有所不同,但文档应该清楚地说明如何禁用此功能。这会让你对UpdatePanel
的需求更加强烈。允许您在PostBack
上正确保存数据。
除了UpdatePanel之外,使用telerik Ajaxloadingpanel这对您的代码有好处——试试这个例子
<telerik:RadAjaxLoadingPanel ID="rlp" runat="server" Skin="Metro">
</telerik:RadAjaxLoadingPanel>
<telerik:RadAjaxPanel runat="server" LoadingPanelID="rlp" skin="Metro">
<telerik:RadDatePicker ID="rdpDate1" runat="server">
</telerik:RadDatePicker>
<telerik:RadComboBox ID="ddlCountry" runat="server">
</telerik:RadComboBox>
</telerik:RadAjaxPanel>