2009-04-28 10 views
1

私はsite.masterファイルに追加したいデータベースメニュー構造を持っています。ASP.NET MVC - データベース駆動メニュー

私はStackOverflowで他の質問を見てきましたが、私のウェブサイトでこれを動作させることはできません。

ユーザーコントロールをSite.Masterファイルに追加するにはどうすればよいですか?

Menu.ascx

<%foreach (MainMenuSort mainMenuSort in (List<MainMenuSort>)ViewData["MainMenuSortListDisplay"]) 
     { %> 
     <li><%= Html.Encode(mainMenuSort.MainMenuId.MainMenuName)%></li> 
     <%foreach (SubMenuSort subMenuSort in (List<SubMenuSort>)ViewData["SubMenuSortListDisplay"]) 
      {%> 
      <%if (mainMenuSort.MainMenuId.Id == subMenuSort.SubMenuId.MainMenu.Id) 
       { %> 
       <li><%= Html.Encode(subMenuSort.SubMenuId.SubMenuName)%></li> 
      <%} %> 
     <%} %> 
     <%}%> 

答えて

0

linkの助けを借りて。私はsite.masterページにメニューを表示することができました。

3

あなたのマスターページにHtml.RenderPartialメソッドを使用する必要があります。

マスターページを使用するビューを呼び出すアクションで、MainMenuSortListDisplayおよびSubMenuSortListDisplayビューのデータキーを設定する必要があります。

マスターの使用では

この

<% Html.RenderPartial("~/Views/Shared/Menu.ascx"); 

パスは、コントロールのフォルダへのアプリの相対パスにする必要があります。通常これらはSharedの下にあります。共有フォルダの下に必要な構造を作成することができます。

この手法を強化するには、強く型付けされた部分を使用します。質問では、2つのジェネリックコレクションを持つ新しいクラス(MenuModel)をプロパティとして作成し、アプリケーションのmodelsフォルダに配置します。次に、モデルのコンストラクタで、リストに値を設定するメソッドを呼び出します。

public class MenuModel 
{ 
    public IEnumerable<MainMenuSort> OuterList {get; set;} 
    public IEnumerable<SubMEnuSort> InnerList {get; set;} 
    public MenuModel() 
    { 
     VoidThatFillsTheInnerAndOuterList(); 
    } 

これは、このキーを設定した

public ActionResult ShowAForm() 
{ 
    ViewData["MenuPartialData"] = new MenuModel(); 
    return View(); 
} 

、あなたのマスターページが、この

<% Html.RenderPartial(
    "~/View/Shared/Menu.ascx", 
    (MenuModel)ViewData["MenuPartialData"]); %> 

このように、れるrenderPartialのオーバーロードを使用することができ、あなたのコントローラでこれを行うことができることを意味しますあなたのpartialがMenuModelクラスに強く型付けされていると仮定します。次に、部分的にあなたが少し

あなたのコードを書き換えたモデルを使用することができます
<% foreach (MainMenuSort mainMenuSort in Model.OuterList) { %> 
    <li><%= Html.Encode(mainMenuSort.MainMenuId.MainMenuName)%></li> 
    <% foreach (SubMenuSort subMenuSort in Model.InnerList) {%>    
     <%if (mainMenuSort.MainMenuId.Id == subMenuSort.SubMenuId.MainMenu.Id) 
     { %>    
      <li><%= Html.Encode(subMenuSort.SubMenuId.SubMenuName)%></li> 
     <%} %> 
    <%} %>  
    <%}%> 

希望

+0

ありがとうございます。単にASP.NET MVCを学び、<%Html.RenderPartial( "〜/ Views/Shared/Menu.ascx");%>をsite.masterページに追加しましたが、あなたが意味することを理解していません。マスターページを使用するビューを呼び出すアクションで、MainMenuSortListDisplayおよびSubMenuSortListDisplayビューのデータキーを設定します。「 – Ros

+0

あなたのコントローラクラス内のActionResultメソッドを使用してページを呼び出します。この方法では、あなたがのViewDataキーが ViewDataを例えば設定する必要がありますあなたがSTIL​​申し訳 –

+0

バックシャウト、まだメニューを表示することができません。サンプルコードへのリンクを投稿できますか?ありがとう。 –

0

<% Html.RenderPartial("Menu") %> 

EDITのようなものを試してみてください助けている:あなたはまた、

0

タイプミスを可能性が修正されHTMLHelperとしてそれを行い、MasterPageで単に<%= Html.Menu()%>を呼び出します。 HTMLHelperには、データベースレコードを取得してループするコードがあります。ここでは、私があなたを始められるために見つけたlinkです。私のコメントには、提供されたコード例にバグがあるので注意してください。私はまだメニューの副題を扱う問題を抱えている、私は再帰的な関数か何かを必要と思いますか?

+0

リンクを送信していただきありがとうございます。私は部分的なリクエストを使ってhttp://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/に従った – Ros

関連する問題