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 のようなクエリ文字列を渡しています。このようにして、ページ上の指定された TreeFilter ごとに使用される各メニューに ID を渡すことができます。また、その情報をコード ビハインド ファイルに取り込み、それを TreeFilter で使用するために int に変換することもできます (次のコードはすべて PageLoad で実行されます)。

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

ただし、MenuModelSource.TreeFilter は、375 メニューではなく 355 メニューをレンダリングしています。

以下を使用して、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 に答える