2011-10-26 37 views
1

我发现在我们的代码在此之后,我意识到了一些东西:在哪里把共享项目(如菜单)的逻辑与MVC3?

  • “得到它现在完成了,得到它的权利后”有一个限制
  • 我真的不知道这与去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的情况?

回答

1

子操作对于此场景来说是完美的。生成视图所需的逻辑包含在一个控制器动作中,就像普通的一样,想要使用子动作的视图只是呈现动作。

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

例如

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

想要呈现子动作的视图确实如此。

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

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

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

+0

我真的很喜欢这个。 –

+0

这基本上就是我如何处理我的主菜单,以及在不同视图中呈现的其他几个“窗口小部件”类型的HTML块。这种模式运作良好。 – StanK

1

您不应该(必须)访问View中的Repository。这属于控制器。

并且菜单在主页面中实现,您不会在细节上给出太多细节。

+0

我不认为这真的回答了这个问题。他要求提供关于如何获取全局数据并将其传递给_layout或其他非视图对象的最佳实践。 –

+0

问题(的开头)与标题不匹配。有一些Linq代码来填充组合框,他问他“这是怎么回事”。 –

+0

不知道你为什么被downvoted,所以有一个+1。我很清楚我(不是,我没有写这个......)不应该访问存储库,或者不应该在视图中新增任何内容。我会更新我的问题,使其更加明显。 –

2

看起来这解决了这个问题非常好(见标有答案,而不是原来的问题):

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(...),它会建立它所需要的模型,而不是强迫你让每个模型都需要一个菜单​​项列表。

+0

这似乎是一个合理的想法。 –

+0

'RenderAction'将解决我的问题,如果我可以使编辑器模板的行为也如此。 –

2

对我个人来说,我会根据活动目录组进行很多菜单过滤,所以我需要知道他们在整个应用程序中的访问级别。

我创建一个新的控制器,我称之为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元素时为我的所有页面提供访问这些变量的权限。