2012-03-13 12 views
0

MVC 3アプリを作成していますが、コントローラーでコードを作成しようとしましたが(権限によって異なるメニュー項目が異なるユーザーに表示される)、そのオブジェクトをカミソリページ。例えば、Controllerに私のような何かを実行します。コントローラーからステートメントを挿入

public ActionResult Index() 
{ 
    var menu = "@(Html.Telerik().Menu().Name("menu").Items("menus => { menus.Add().Text("Home").Action("Index", "Home"); menus.Add().Text("Deliveries").Action("Index", "Delivery"); }))"; 

    var model = new MenuModel() 
    { 
     Menu = menu 
    }; 

    return View(model); 
} 

をそしてViewに私が@Model.Menuを使用してメニューをレンダリングしようとするが、私はちょうどstring値ではなく、実際のメニューを取得します。私がしようとしていることは可能ですか?

+0

なぜあなたは、コントローラにカミソリを使用しようとしている:私はあなたのコントローラとビュー例えば擬似コードの間でデータを永続化する新しいMenuItemViewModelオブジェクトを作成する意味ですか?このコードはビューに属します。コントローラロジックとプレゼンテーションロジックを混在させないでください。 –

+0

私はそれが何処にあるのかわからないので、剃刀のロジックを剃刀のビューに入れることができません。 –

+1

その時点で何がわかるのですか? Telerikヘルパーは高度にカスタマイズ可能で、モデル内のさまざまな条件と値に基づいて異なるマークアップを生成できます。あなたは正確に何を達成しようとしていますか? –

答えて

0

HtmlHelperクラスを拡張して表示してあなたのメニューをレンダリングするために、新しく作成されたメソッドを使用します。

ヘルパー:

public static string RenderMenu(this HtmlHelper html) 
{ 
    var menu = new StringBuilder(); 

    /* ... menu rendering logic ... */ 

    return menu.ToString(); 
} 

ビュー:

それでも
@Html.RenderMenu(); 

、このロジックをビューに入れても問題ありません。 HtmlHelper拡張機能を使用すると、コードが分離/消去されます。

0

なぜこれをやりたいですか?これは、MVCの懸念の分離を壊している - あなたのコントローラはどのようにメニューが表示され、表示するためのビューに適切なデータを取得するだけで心配する必要はありません。

セキュリティトリミングを実行する場合は、ビルダー文字列を渡さないでください。利用可能な他の方法があります。

  1. あなたは[承認]コントローラの属性(学び、セットアップする作業のビットが、偉大なそのそこに1回)に対してトリミングセキュリティを扱うことができるMVC SiteMap providerを試みることができます。
  2. 独自のフラグのコレクションまたはビルド前のメニュー項目、like what Greg suggestedを渡します。
  3. HtmlHelper拡張機能を作成します。コントローラの承認属性をチェックする 'IsAuthorized()'のようなものです。 MVCサイトマップに切り替える前に私が使用していたもののHere's a gist
  4. HTMLヘルパーで

、あなたはこれを行うことができます。

@(Html.Telerik().Menu() 
    .Name("Menu") 
    .Items(m => 
    { 
     @* Publicly Accessible Controller *@ 
     m.Add() 
      .Text("Home").Url(Url.Action("Index", "Home")); 

     @* Secure Controller *@ 
     if (Html.IsAuthorized<MyProject.Controllers.SecureController>(c => c.Index())) 
     { 
      //m.Add().... 
     } 
     ..... 
0

私はそれにそれが可能であった場合でも、そのようにやるのは嫌です!

コントローラーを切り離して、現在行っている以上に表示する必要があります。

コントローラーは、ビューに必要なデータのみを渡す必要があります。ビューに異なるメニュー項目を持つメニューが必要な場合は、コントローラーを使用して、ビューが持つべきメニュー項目を決定し、それらをリストオブジェクトに追加し、そのリストをビューに渡します。ビューは、メニュー項目のリストに基づいてメニューを作成します。

また、「メニュー項目」と言うとき、マークアップを意味するわけではありません。

public class MenuItemViewModel { string url, string text } 
List<MenuItemViewModel> menuitems ... 
return View(menuitems) 
関連する問題