在哪里放置MVC3共享项目(如菜单)的逻辑

本文关键字:菜单 MVC3 共享 项目 在哪里 | 更新日期: 2023-09-27 18:12:34

在我的代码中发现这一点后,我意识到一些事情:

  • "get it done now, get it right later"是有限制的
  • 我实际上不知道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中,但我真的想摆脱它。

编辑:即使我开始询问布局代码,我假设它适用于EditorTemplates和DisplayTemplates,以及。如果这是一个不正确的假设,请告诉我这些应该放在哪里。

edit2:我最终想要的是有一个干净的,甚至可能是依赖注入的地方来运行从EditorTemplate调用的代码。也许这是EditorTemplate立即调用RenderAction的情况?

在哪里放置MVC3共享项目(如菜单)的逻辑

看起来这很好地解决了问题(请参阅标记的答案,而不是原始问题):

http://forums.asp.net/t/1566328.aspx/1?Building MVC + + ASP +网络+主+基于动态页面菜单+ + + + + +电流+用户+ +角色+年代+"+

基本上,调用RenderAction(...),它将构建它需要的模型,而不是强迫您让每个模型都需要一个菜单项列表。

就我个人而言,我做了很多基于活动目录组的菜单过滤,所以我需要知道它们在整个应用程序中的访问级别。

我创建了一个名为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
{}

这将我所有的服务器逻辑保存在一个文件中用于管理权限,并且当我需要根据权限隐藏或显示不同的ui元素时,我的所有页面都可以访问这些变量。

Child Actions非常适合这个场景。生成视图所需的逻辑被封装在控制器动作中,就像普通的那样,而想要使用子动作的视图只是简单地呈现动作。

你也可以缓存这些部分视图,这对于像主菜单这样的东西是有意义的——因为用户的权限不会经常改变。

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

想要呈现子动作的视图是这样做的。

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

因此,调用ChildAction的视图不需要知道视图需要什么模型。

也有重载的RenderAction,如果你的子动作需要你传递参数给它。

您不应该(必须)访问视图中的存储库。它属于控制器。

菜单是在主页中实现的,你没有给出太多细节。