在哪里放置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的情况?
看起来这很好地解决了问题(请参阅标记的答案,而不是原始问题):
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,如果你的子动作需要你传递参数给它。
您不应该(必须)访问视图中的存储库。它属于控制器。
菜单是在主页中实现的,你没有给出太多细节。