2012-03-13 3 views
0

Я пишу приложение MVC 3, и я попытался закодировать элемент управления в контроллере (из-за разрешений разные элементы меню будут видны для разных пользователей) и используйте объект в Razor стр. Например, в 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

Почему вы пытаетесь использовать бритву в контроллере? Этот код относится к представлению.Не смешивайте логику контроллера с логикой представления. –

+0

Я не могу поместить логику Razor в Razor View, потому что я не знаю, что будет в этот момент. –

+1

Почему бы вам не знать, что будет в этот момент? Помощники Telerik очень настраиваются, позволяя создавать разную разметку на основе разных условий и значений в вашей модели. Что именно вы пытаетесь достичь? –

ответ

0

Продлить HtmlHelper класс и использовать вновь созданный метод, чтобы сделать ваше меню в представлении:

Helper:

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

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

    return menu.ToString(); 
} 

Вид:

@Html.RenderMenu(); 

Тем не менее, это хорошо, чтобы поставить эту логику в точку зрения. Использование расширения HtmlHelper просто отделяет/очищает код.

0

Зачем вам это нужно? Это нарушает разделение проблем в MVC - ваш контроллер не должен беспокоиться о , так как отображается меню, просто получая нужные данные для отображения.

Если вы хотите выполнить обрезку безопасности, не переходите в строку строителя. Существуют и другие доступные методы.

  1. Вы можете попробовать MVC SiteMap provider, который может обрабатывать обрезки против [Авторизоваться] атрибутов контроллера безопасности (немного работы, чтобы учиться и настройки, но большой, как только его там).
  2. Передайте свою собственную коллекцию флагов или элементы меню предварительной сборки, like what Greg suggested.
  3. Сделайте расширение HtmlHelper, что-то вроде «IsAuthorized()», который будет проверять атрибуты авторизации контроллера. Here's a gist того, что я использовал перед переключением на файл MVC.

С 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

Я не хотел бы сделать это таким образом, даже если бы это было возможно!

Вы должны отключить контроллер и просмотреть больше, чем вы сейчас делаете.

Контроллер должен передавать только те данные, которые требуются для просмотра. Если для просмотра требуется меню с различными пунктами меню, используйте контроллер, чтобы определить, какие элементы меню должны иметь вид, а затем добавить их в объект списка и передать этот список в представление. Затем представление создаст меню, основанное на списке пунктов меню.

Также, когда я говорю «пункты меню», я не имею в виду разметку! Я имею в виду создать новый объект MenuItemViewModel упорствовать данных между контроллером и ваш взгляд например псевдо код:

public class MenuItemViewModel { string url, string text } 
List<MenuItemViewModel> menuitems ... 
return View(menuitems) 
Смежные вопросы