我有一个sitecore proejct,我已经以ascx用户控件的形式准备了一个子布局。我需要在这个用户控件中设置级联下拉菜单,并根据我发现的UpdatePanel是要走的路。问题是UpdatePanel似乎刷新了整个控件,我认为这不是正确的行为。
我知道SO上有一些类似的问题,但没有一个解决方案适合我。我也开始怀疑这可能是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中显示Null异常。这是在控制面板之外。注意:我还添加了一个脚本管理器。
我尝试过很多东西。设置不同的更新模式,通过从Package Manager控制台执行Install-Package AjaxControlToolkit来更新我的解决方案中的AjaxToolkit ......但行为保持不变。
谢谢。
答案 0 :(得分:5)
将DDL1的数据绑定放到OnInit
,而不是Page_Load
。
并且不要在那里包含if
语句,只需要执行数据绑定
在OnInit
之后,将正确设置所选值,并且您将能够访问其他事件处理程序中的DDL1选项。
答案 1 :(得分:0)
你有一个asp:DropDownList控件,AutoPostBack设置为true。
从Dropdownlist控件中删除AutoPostBack = true,并为UpdatePanel设置Async触发器,设置为Dropdownlist,其eventname =“SelectedIndexChanged”
这是一个已知问题,您可以找到很多关于它的文档。