Внедрить заявление из контроллера - PullRequest
0 голосов
/ 13 марта 2012

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

Ответы [ 3 ]

0 голосов
/ 13 марта 2012

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

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

  1. Вы можете попробовать поставщика MVC SiteMap *1009*, который может обрабатывать обрезку безопасности по атрибутам контроллера [Authorize] (немного работы для изучения и настройки, ноздорово, когда он там).
  2. Передайте свою собственную коллекцию флагов или пунктов меню предварительной сборки, как то, что предложил Грег .
  3. Создайте расширение HtmlHelper, что-то вродеIsAuthorized (), который будет проверять атрибуты авторизации контроллера. Вот суть , которую я использовал перед переключением на карту сайта 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 голосов
/ 13 марта 2012

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

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

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

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

public class MenuItemViewModel { string url, string text }
List<MenuItemViewModel> menuitems ...
return View(menuitems)
0 голосов
/ 13 марта 2012

Расширьте класс HtmlHelper и используйте вновь созданный метод для отображения вашего меню в представлении:

Помощник:

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

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

    return menu.ToString();
}

Просмотр:

@Html.RenderMenu();

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

...