在更新面板中放置多个控件的正确方法是什么

本文关键字:控件 是什么 方法 更新 | 更新日期: 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>