master页面中的scriptmanager和用户控件中的updatepanel。部分回发没有发生

时间:2009-06-19 03:33:37

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

我有一个母版页,其中包含以下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>  

我已经尝试了谷歌推荐的大部分选项,但我无法进行部分回发。 evry time selectedindex被改变它做了整页回发。你可以看到下拉是在itemtemplate中并重复。 你觉得我做错了什么,它只是更新面板没有触发回发。

3 个答案:

答案 0 :(得分:2)

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

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

</asp:ScriptManager>

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

答案 1 :(得分:0)

我构建了一个模拟文件的小测试项目。我没有使用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;
        }
    }
}

答案 2 :(得分:0)

我在<asp:UpdatePanel ID="id" runat="server" ChildrenAsTriggers="true" UpdateMode="always" >定义中看到UpdatePanel - 如果您希望UpdatePanel异步工作,则需要UpdateMode="Conditional"。不知道为什么ASP:.NET开发人员没有把它设置为条件作为默认值(我有时会忘记它)。

也许那已经是它了?