Где разместить логику для общих элементов (например, меню) с MVC3? - PullRequest
1 голос
/ 27 октября 2011

После того, как я нашел это в нашем коде, я понял несколько вещей:

  • "сделай это сейчас, сделай это позже" имеет предел
  • Iна самом деле не знаю, где это происходит с MVC3

    @model int
    @using Company.Core.Logic.Financial
    @using Company.Core.Repositories
    @{
         var values = from AccountPlan e in new AccountPlanRepository().GetItemList()
                      where String.IsNullOrEmpty(e.PromoCode) // filter out promotional plans
                      select new { id = e.AccountPlanId, name = e.Description };
         var items = new SelectList(values, "id", "name", Model);
     }
    
    @Html.DropDownListFor(m => m, items)
    

Это конкретно шаблон редактора (@Html.EditorFor(m => m.AccountPlan)), но он заставил меня понять, что я не знаю, где этоКод такого рода подходит для таких общих вещей, как построители меню.Если вы используете макеты для MVC3 (а кто нет), где находится код для построения меню в верхней части на основе ролей пользователя?Я мог бы предположить, что код представления будет перебирать предварительно созданные пункты меню и HTML-кодировать их, но поскольку Модель строго типизирована, означает ли это, что все Модели должны знать элементы меню?

На этот раз, здесь Webforms имеют больше смысла для меня, так как это будет в CodeBehind, но я действительно хочу уйти от этого.

edit: хотя я начал спрашивать о коде Layout,Я предполагаю, что это работает и для EditorTemplates, и для DisplayTemplates.Если это неверное предположение, пожалуйста, дайте мне знать, куда они должны идти.

edit2: В конечном итоге я хочу иметь чистое, возможно, даже место для внедрения зависимостей для запуска кода, который вызывается из EditorTemplate.Возможно, это тот случай, когда EditorTemplate сразу вызывает в RenderAction?

Ответы [ 4 ]

2 голосов
/ 27 октября 2011

Похоже, что это решает проблему довольно хорошо (см. Отмеченный ответ, а не исходный вопрос):

http://forums.asp.net/t/1566328.aspx/1?Building+ASP+NET+MVC+Master+Page+Menu+Dynamically+Based+on+the+current+User+s+Role+s+quot+

По сути, позвоните RenderAction(...), и он построит модельдля этого нужно вместо того, чтобы заставлять каждую модель требовать список пунктов меню.

2 голосов
/ 27 октября 2011

Лично я делаю большую фильтрацию меню по группам активных каталогов, поэтому мне нужно знать, каковы их уровни доступа во всем приложении.

Я создаю новый контроллер, который я называю ControllerBase

public class ControllerBase : Controller
{
    //authorization group setting an menu creation here.
    //set properties and objects to ViewBag items to access from the front end.

    protected override void Dispose(bool disposing)
    {
        _db.Dispose();
        base.Dispose(disposing);
    }
}

и затем на всех других контроллерах в моем проекте я просто расширяю из ControllerBase

public class HomeController : ControllerBase
{}

Это сохраняет всю мою логику сервера в одном файле для управления разрешениями и дает всем моим страницам доступ к этим переменным, когда мне нужно скрыть или показать различные элементы пользовательского интерфейса в зависимости от разрешений.

1 голос
/ 27 октября 2011

Действия ребенка идеально подходят для этого сценария. Логика, необходимая для генерации представления, заключена в действие контроллера, как обычно, и представление, которое хочет использовать дочернее действие, просто отображает действие.

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

, например

[OutputCache(Duration = 300)]
[ChildActionOnly]
public ViewResult MainMenu()
{
    var model = GetMenuModel();
    return View(model);
}

Представление, которое хочет отобразить дочернее действие, делает это следующим образом.

 @{ Html.RenderAction("MainMenu", "Account"); }

И, таким образом, представлению, вызывающему ChildAction, не нужно знать, какая модель требуется для представления.

Существуют также перегрузки в RenderAction, если ваше дочернее действие требует, чтобы вы передали ему параметры.

1 голос
/ 27 октября 2011

Вы не должны (должны) получать доступ к хранилищу внутри представления.Это относится к контроллеру.

И меню реализовано на главной странице, вы не даете много подробностей о специфике.

...