【问题标题】:scriptmanager in masterpage and updatepanel in usercontrol. Partial postback not happening母版页中的脚本管理器和用户控件中的更新面板。部分回发未发生
【发布时间】:2009-06-19 03:33:37
【问题描述】:

我有一个带有以下 scriptmanager 标签的母版页:

<asp:ScriptManager ID="scriptManger" EnablePartialRendering="true" runat="server" >
    <Scripts>
        <asp:ScriptReference Path="~/common/js/jquery-1.3.2.js" />
        <asp:ScriptReference Path="~/common/js/validation.js" />
    </Scripts>
</asp:ScriptManager>

我的 aspx 页面是:

    <%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/common/MasterPages/Login.master" CodeBehind="SecurityQuestionsEnroll.aspx.cs" Inherits="Login.SecurityQuestionsEnroll" %>

    <%@ Register src="~/controls/Views/Login/SecurityQuestions.ascx" tagname="SecurityQuestions" tagprefix="uc1" %>

这是用户控件:

  <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="always"  >
<ContentTemplate>  
    <asp:DataList ID="dlSecurityQuestions" runat="server" AutoPostBack="true" OnSelectedIndexChanged ="dlSecurityQuestions_SelectedIndexChanged">
        <ItemTemplate>
            <div>
                <asp:Label ID="lbl_question" AssociatedControlID="lst_question" runat="server"><%# DataBinder.Eval(Container.DataItem, "QuestionName")%></asp:Label>
                <asp:DropDownList ID="lst_question" runat="server" AutoPostBack="true" >
                    <asp:ListItem Value="0">Select a Question...</asp:ListItem>
                    <asp:ListItem Value="1">Select a Question1..</asp:ListItem>
                </asp:DropDownList>
            </div>
            <div>
                <asp:Label ID="lbl_answer1" AssociatedControlID="txt_answer" runat="server">Answer *</asp:Label>
                <asp:TextBox ID="txt_answer" runat="server" />
                <div id="validate"></div>
            </div>
        </ItemTemplate>
    </asp:DataList>
</ContentTemplate>
</asp:UpdatePanel>  

我已经尝试了谷歌推荐的大部分选项,但我无法进行部分回发。每次更改 selectedindex 时,它都会进行整页回发。如您所见,下拉菜单位于 itemtemplate 中并被重复。 你认为我做错了什么,它没有触发更新面板的回发。

【问题讨论】:

    标签: asp.net-ajax user-controls updatepanel master-pages


    【解决方案1】:

    如果您有更新面板但没有脚本管理器,则此方法有效:

    <asp:ScriptManager ID="scriptManger" EnablePartialRendering="true" runat="server" >
    
    </asp:ScriptManager>
    

    但我也有一个母版页。所以我想知道是不是因为我需要脚本管理器的母版页

    【讨论】:

      【解决方案2】:

      我构建了一个小测试项目,稍微模仿您的文件。我没有使用 DataList,我已将需要更新的区域移到单独的 div 中(这意味着如果您保留 DataList,我认为您的问题/答案不会像您一样位于 DataList 中现在就拥有它。所以现在,我构建的示例只是从下拉列表中获取文本,并使用用户选择的选项更新 UpdatePanel 中的文字。

      这是我的代码:

      母版页:

      <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="UpdatePanelTest.Site1" %>
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
      <html xmlns="http://www.w3.org/1999/xhtml" >
      <head runat="server">
          <title></title>
          <asp:ContentPlaceHolder ID="head" runat="server">
          </asp:ContentPlaceHolder>
      </head>
      <body>
          <form id="form1" runat="server">
          <asp:ScriptManager ID="scriptManger" EnablePartialRendering="true" runat="server" >
              <Scripts>
                  <asp:ScriptReference Path="~/common/js/jquery-1.3.2.min.js" />
              </Scripts>
          </asp:ScriptManager>
      
          <div>
              <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
      
              </asp:ContentPlaceHolder>
          </div>
      
      
          </form>
      </body>
      </html>
      

      默认页面(代码隐藏中没有额外的代码):

      <%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="UpdatePanelTest.Default" %>
      <%@ Register src="Selector.ascx" tagname="Selector" tagprefix="uc1" %>
      <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
      </asp:Content>
      <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
      
          <uc1:Selector ID="Selector1" runat="server" />
      
      </asp:Content>
      

      用户控制(Html):

      <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Selector.ascx.cs" Inherits="UpdatePanelTest.Selector" %>
      <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="always"  >
      <ContentTemplate>  
          <asp:DropDownList ID="lst_question" runat="server" AutoPostBack="true" 
          onselectedindexchanged="lst_question_SelectedIndexChanged" >
              <asp:ListItem Value="0">Option 1</asp:ListItem>
              <asp:ListItem Value="1">Option 2</asp:ListItem>
          </asp:DropDownList>
      
          <div>
              <asp:Literal ID="Literal1" runat="server"></asp:Literal>
          </div>
      </ContentTemplate>
      </asp:UpdatePanel>
      

      用户控制(代码隐藏):

      using System;
      using System.Web.UI.WebControls;
      
      namespace UpdatePanelTest
      {
          public partial class Selector : System.Web.UI.UserControl
          {
              protected void Page_Load(object sender, EventArgs e)
              {
      
              }
      
              protected void lst_question_SelectedIndexChanged(object sender, EventArgs e)
              {
                  var ddl = sender as DropDownList;
                  Literal1.Text = "You selected " + ddl.SelectedItem.Text;
              }
          }
      }
      

      【讨论】:

      • 谢谢,但整个问题在于数据列表,数据列表中的项目无法触发更新面板回发
      • 您能否更详细地说明您通过以这种方式使用数据列表来完成的工作(例如,您希望在数据列表中发生什么)?我会多玩一点,但由于我无权访问您的项目,我只是猜测您的代码隐藏文件中幕后发生的事情。至少看到您的 OnSelectedIndexChanged 处理程序会很有帮助。
      • 列表中的项目根据 NumberOfQuestion int 属性重复。因此,如果问题数量为 2,则会显示 2 个 itemtemplate,如果 4 ...则 4 ...等等。不同的页面使用此控件,但一次显示的下拉列表数量不同。
      【解决方案3】:

      我在您的 UpdatePanel 定义中看到了 &lt;asp:UpdatePanel ID="id" runat="server" ChildrenAsTriggers="true" UpdateMode="always" &gt; - 如果您希望 UpdatePanel 异步工作,则必须是 UpdateMode="Conditional"。不知道为什么 ASP:NET 开发人员一开始没有将其设置为 Conditional 作为默认值(我有时还是会忘记它)。

      也许已经是这样了?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 2010-10-08
        • 1970-01-01
        • 2011-03-15
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多