2013-12-11 61 views
4

我有一个sitecore项目,其中我准备了一个ascx用户控件的子布局。我需要在这个用户控件中设置级联下拉菜单,并且基于我发现的UpdatePanel是要走的路。问题是UpdatePanel似乎更新了整个控件,我认为这不是正确的行为。ascx中的更新面板刷新整个控件

我知道这里有一些类似的问题,但没有解决方案为我工作。我也开始怀疑这可能是一个Sitecore特定的问题。

下面是用户控件的代码示例:

<p><%= MyItem.Text %>" /></p> 

    <asp:UpdatePanel ID="LocationFilterUpdatePanel" runat="server"> 
    <ContentTemplate> 

     <asp:DropDownList ID="DDL1" OnSelectedIndexChanged="DDL1_SelectedIndexChanged" runat="server" AutoPostBack="true"> 

     </asp:DropDownList> 


     <asp:DropDownList ID="DDL2" OnSelectedIndexChanged="DDL2_SelectedIndexChanged" runat="server" AutoPostBack="true"> 

     </asp:DropDownList> 

    </ContentTemplate> 
    </asp:UpdatePanel> 

而后面的代码:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!System.Web.UI.ScriptManager.GetCurrent(Page).IsInAsyncPostBack) 
     { 
      var context = new SitecoreContext(); 
      //Get Model from Sitecore 

      DDL1.DataSource = Model.Data; 
      DDL1.DataValueField = "Id"; 
      DDL1.DataTextField = "Name"; 
      DDL1.DataBind(); 
     } 

    } 

    protected void DDL1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     var context = new SitecoreContext(); 
     //Get Model from Sitecore 

     DDL2.DataSource = Model.Data; 
     DDL2.DataValueField = "Id"; 
     DDL2.DataTextField = "Name"; 
     DDL2.DataBind(); 
    } 

    protected void DDL2_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    } 

的页面加载罚款,但(调试时)改变DDL1的指数,它会显示MyItem.Text中的空异常。这在控制面板之外。注意:我还添加了一个脚本管理器。

我尝试过很多东西。设置不同的更新模式,通过从软件包管理器控制台执行Install-Package AjaxControlToolkit来更新我的解决方案中的AjaxToolkit ...但行为保持不变。

谢谢。

回答

5

将DDL1的数据绑定设置为OnInit,而不是Page_Load
并且不要在那里包括if声明,只要做数据绑定。
OnInit之后,所选值将被正确设置,并且您将能够访问其他事件处理程序中的DDL1选项。

+0

谢谢。有效。 如果你知道它为什么在OnInit中工作,而不是Page_Load,我将不胜感激?我建立了一个单独的项目来尝试和(非sitecore),如果我在页面加载中保留代码,它工作正常吗? –

+3

它的工作原理是因为在OnInit期间,viewstate值尚未加载。所以你有机会用值填充下拉列表。然后,在OnInit和Page_Load之间,触发PreLoad事件,在此期间视图状态被加载并应用于控件(例如,它设置选定的索引)。有关所有详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms178472.aspx。 –

+0

这确实发生了什么。 – Younes

0

你有一个AutoPostBack设置为true的asp:DropDownList控件。

从下拉列表控制取出的AutoPostBack =真,并设置一个异步触发您的UpdatePanel,设置为下拉列表和事件名称=“的SelectedIndexChanged”

这是一个已知的问题,你会发现很多文档关于它。

+0

这会导致事件根本不会触发。 我明白,如果DropDownList在控件中,则不需要触发器。 如果我这样做,DropDownList不会触发该事件。 我已经在一个单独的项目中尝试了这一点,它工作得很好。我怀疑Sitecore 7(或其中安装的模块之一)正在破坏更新面板的功能。 –