我试图传递电子:MenuModelSource的值。treeffilter控件将用于生成给定菜单。我能够从查询字符串
中获得值我正在研究菜单解决方案,我不知道该怎么做。
我需要设置以下web服务器控件的treeffilter属性的Id:
<ektron:MenuModelSource ID="menuModelSource2" runat="server">
<TreeFilter Id="355" Depth="1" />
</ektron:MenuModelSource>
我正在传递一个查询字符串,看起来像:?top=355&side=375&low=123这样一个id可以传递给每个菜单被每个指定的treeffilter在一个页面上使用。我还能够将该信息拉到文件后面的代码中,并将其转换为int供TreeFilter使用(以下所有代码都在PageLoad中完成):
string sideIdstr = Request.QueryString["side"];
int sideId = Convert.ToInt32(sideIdstr);
menuModelSource2.TreeFilter.Id = sideId;
然而,MenuModelSource。treeffilter仍然渲染355菜单,而不是375菜单。
我可以通过以下命令"验证"id确实被更改为375:
Response.Write("<h1>" + menuModelSource2.TreeFilter.Id + "</h1>");
…在页面上显示375。
我应该怎么做,而不是得到treeffilter使用id从查询字符串?有人建议在服务器控件上尝试DataBind(),但我仍然得到相同的结果。下面是我当前的代码:
protected void Page_Load(object sender, EventArgs e)
{
Ektron.Cms.API.Content.Content ContentAPI = new Ektron.Cms.API.Content.Content();
Page.Title = ContentAPI.GetContent(PageHost1.PageID).Title;
string sideIdstr = Request.QueryString["side"];
int sideId = Convert.ToInt32(sideIdstr);
menuModelSource2.TreeFilter.Id = sideId;
menuModelSource2.DataBind();
menuView2.DataBind();
Response.Write("<h1>" + menuModelSource2.TreeFilter.Id + "</h1>");
}
…我的标记是这样的…
<ektron:MenuModelSource ID="menuModelSource2" runat="server">
<TreeFilter Id="355" Depth="1" />
</ektron:MenuModelSource>
<ektron:MenuView ID="menuView2" runat="server" ModelSourceID="menuModelSource2">
<ListTemplate>
<ul id="menunav" runat="server" class="unstyled subnav">
<asp:PlaceHolder ID="listPlaceholder" runat="server" />
</ul>
</ListTemplate>
<ItemTemplate>
<li <%# ((Eval("Type").ToString().ToLower() == "submenu")) ? @" class=""subnav""" : @" class=""menuitem""" %>>
<asp:HyperLink ID="nodeLink" runat="server" Text='<%# Eval("Text") %>' NavigateUrl='<%# Utility.getNavigateUrl( Eval("NavigateUrl") ) %>' />
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</li>
</ItemTemplate>
</ektron:MenuView>
如果有人有更好的方法来做到这一点,比如使用Ektron框架API,我也会开放。
更新模型源的参数后,您需要在模型源上调用LoadData。然而,该方法不是公共的,因此您需要使用反射来调用该方法。
menuModelSource2.GetType().GetMethod("LoadData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy).Invoke(menuModelSource2, new object[] { });
这在reference.ektron.com上有记录,参见aspx.cs选项卡。它在底部。