2

我正在尝试传递 ektron:MenuModelSource.TreeFilter 控件将用于生成给定菜单的值。我能够从查询字符串中获取值

我正在研究菜单解决方案,并且不知道该怎么做。

我需要为下面的 Web 服务器控件的 TreeFilter 属性设置 Id:

<ektron:MenuModelSource ID="menuModelSource2" runat="server">
  <TreeFilter Id="355" Depth="1" />
</ektron:MenuModelSource>

我正在传递一个查询字符串,如下所示: ?top=355&side=375&low=123 。这样,可以为每个菜单传递一个 id,以供页面上的每个指定 TreeFilter 使用。我还能够将该信息提取到文件后面的代码中,并将其转换为 int 以供 TreeFilter 使用(以下所有代码都在 PageLoad 中完成):

string sideIdstr = Request.QueryString["side"];
int sideId = Convert.ToInt32(sideIdstr);
menuModelSource2.TreeFilter.Id = sideId;

但是,MenuModelSource.TreeFilter 仍然呈现 355 菜单而不是 375 菜单。

我可以使用以下命令“验证” id 确实已更改为 375:

Response.Write("<h1>" + menuModelSource2.TreeFilter.Id + "</h1>");

…在页面上显示 375。

我应该怎么做才能让 TreeFilter 使用查询字符串中的 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>");
}

…我的标记是这样的…</p>

<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 Framework API,我也会对此持开放态度。

4

1 回答 1

2

更新模型源的参数后,您需要在模型源上调用 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 选项卡。它在底部。

于 2013-06-22T18:30:56.327 回答