2009-06-19 4 views
1

у меня есть главной страницы со следующей ScriptManager тегом:scriptmanager в masterpage и updatepanel в usercontrol. Частичное постбэк не происходит

<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> 

I попробовали большинство вариантов, которые рекомендует Google, но я не могу сделать частичную обратную передачу. evry time selectedindex изменено, он выполняет полную обратную передачу страницы. выпадающий, как вы можете видеть, находится в itemtemplate и повторяется. Что, по-вашему, я делаю неправильно, чтобы его не обстреливали только после обновления панели обновления.

ответ

0

Я построил небольшой тестовый проект, который немного подражает вашим файлам. Я не использую DataList, и я переместил область, которую нужно обновить, в отдельный div (это означает, что если вы сохраните DataList, я не думаю, что ваш вопрос/ответ будет находиться внутри DataList так, как вы есть теперь Так прямо сейчас, образец я построил просто захватывает текст из выпадающего списка и обновляет буквальный в UpdatePanel с выбранной опцией пользователя

Вот мой код:..

MasterPage:

<%@ 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; 
     } 
    } 
} 
+0

СПАСИБО, но вся проблема связана с источником данных, элементы в datalist не могут вызвать обратную передачу панели обновления – 2009-06-21 22:49:30

+0

Можете ли вы пояснить немного больше о что вы пытаетесь выполнить с помощью списка данных, используя его таким образом (например, что вы ожидаете в списке данных)? Я поиграю с ним немного больше, но поскольку у меня нет доступа к вашему проекту, я только предполагаю, что происходит за кулисами в вашем коде за файлом. Было бы полезно увидеть ваш обработчик OnSelectedIndexChanged, по крайней мере. – nkirkes

+0

Элементы в списке дублируются в соответствии с свойством NumberOfQuestion int. Так что если число вопросов равно 2, 2 itemtemplate покажет, если 4 ... затем 4 ... и так далее. Различные страницы используют этот элемент управления, но одновременно отображаются разные списки выпадающих списков. – 2009-06-22 19:57:30

0

Я вижу <asp:UpdatePanel ID="id" runat="server" ChildrenAsTriggers="true" UpdateMode="always" > в вашем UpdatePanel определения - это должно быть UpdateMode="Conditional", если вы хотите, чтобы ваш UpdatePanel для работы асинхронно. Не знаю, почему разработчики ASP: NET вначале не устанавливали его в качестве условного (по-прежнему иногда забывайте об этом).

Возможно, это уже есть?

2

Это работает, если у вас есть панель обновления, но не менеджер сценариев:

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

</asp:ScriptManager> 

Но у меня есть главная страница. Поэтому я удивляюсь, потому что из-за главной страницы мне нужен диспетчер скриптов

Смежные вопросы