在我们当前的Asp.net MVC应用程序中,我们有两个菜单系统,一个位于顶部,一个位于左侧。现在我们有一个部分视图来呈现菜单,但是这也是唯一能让每个ViewModel返回菜单项的方法吗?我们试图不使用ViewData字典。
我认为答案是肯定的,但我希望看到别人的想法
答案 0 :(得分:3)
除了使用主视图模型之外,如果要为菜单配置自己的控制器等,可以使用MVC Future's库中的“渲染操作”。
答案 1 :(得分:3)
3个选项:
RenderAction一路。
Ryan回答RenderPartial。
一个抽象的MasterViewModel例如。你所有的模型都将继承自己。由动作过滤器填充。
答案 2 :(得分:3)
您使用的是基本控制器吗?我发现使用一个,并重写OnActionExecuting方法帮助我有一个中心位置来保持我所有常见的页面逻辑。
答案 3 :(得分:1)
您基本上有两个选择:
使用ViewModel设置要显示的菜单项,可以从任何视图(全部或部分)访问它们。
创建强类型模型的层次结构,将菜单项放在BaseModel的某处,然后将出现在每个派生模型中。
您可能感兴趣的是异步控制器或部分请求。它没有在ASP.NET MVC中实现,但您可以检查MVC Contrib社区项目,它有一些支持。
答案 4 :(得分:0)
有很多选项可以解决这个问题,但我们发现有一种非常简单的方法可以解决这个问题,而不需要重新构建整个应用程序。
我们遇到过类似的问题,我们的page / partial有一个定义良好的ViewData.Model类型,但是该视图包含一个在多个页面中重复使用的部分。我们也试图避免使用ViewDataDictionary。
但是,我们发现您描述的情况恰好是我们喜欢使用ViewDataDictionary条目的精确场景。我们在应用程序模型中保留一个静态Constants类,它包含每种类型常量的内部类,包括ViewData键,这样我们就没有字符串可以将这些东西浮动到任何地方。
然后,我们的Controller操作填充ViewData键,其他页面/部分内部的部分检查是否存在该键,并使用它而不是ViewData.Model。它可以在任何需要的地方进行部分工作,并保持ViewModel的清洁。通过使用常量,我们可以避免在任何地方使用原始字符串。
答案 5 :(得分:0)
使用ActionFilter使用您需要的菜单信息填充ViewData。仅将其应用于类和/或方法(如果在任何地方需要,可能在基本Controller类上)。在Controller上创建一些扩展方法,使得从ViewData访问数据的方式是强类型的(如果您稍后更改其存储位置,则会透明)。
我最近使用类似方法做了a blog post(我需要在每个页面上显示赞助商列表)。它可能有助于指明您正确的方向。
答案 6 :(得分:0)
为了补充一点,RenderAction被添加到MVC2 Beta中。