2009-11-11 49 views
5

在我们当前的Asp.net MVC应用程序中,我们有两个菜单系统,一个位于顶部,一个位于左侧。现在我们有一个呈现菜单的局部视图,但是这样做的唯一方法是使用每个ViewModel返回菜单项?我们正在尝试不使用ViewData字典。Asp.net MVC动态菜单系统

我认为这个问题的答案是肯定的,但我想看看别人怎么想

回答

3

3个选项:

  1. RenderAction一路。

  2. RenderPartial as Ryan回答。

  3. 一个抽象的MasterViewModel例如。你所有的模型都将继承这一点。由动作过滤器填充。

3

你可以使用从MVC Future's库中的渲染操作,如果你想拥有自己的控制器等,为你的菜单除了从使用主视图模型。

+1

我相信你指的是来自期货大会的RenderAction而非RenderPartial。 – 2009-11-11 15:27:33

+0

你是对的,谢谢 - 我已经编辑过这篇文章。 :) – 2009-11-11 15:56:48

1

你基本上有两种选择:

  1. 使用视图模型设置菜单项显示,他们会从任何视图中,全部或部分使用。

  2. 创建强类型模型的层次结构,将菜单项放到BaseModel的某处,然后将出现在每个派生模型中。

您可能感兴趣的是异步控制器或部分请求。它没有在ASP.NET MVC中实现,但你可以检查MVC Contrib社区项目,它有一些支持。

+0

MVC Contrib库很好,但如果只需要使用MVC Future的库,那么使用MVC未来的库就可以更容易地渲染partials。 – 2009-11-11 15:02:22

0

处理这个问题有很多选择,但有一种非常直接的方式可以处理这个问题,而不需要重新构建整个应用程序。

我们有类似的问题,其中我们的页面/部分具有定义明确的ViewData.Model类型,但视图包含跨多个页面重用的部分。我们也试图避免使用ViewDataDictionary。

但是,我们发现您所描述的情况恰恰是我们喜欢使用ViewDataDictionary条目的EXACT场景。我们在我们的应用程序模型中保留了一个静态的Constants类,该类包含每种类型的常量的内部类,包括ViewData键,这样我们就没有字符串了,这些东西在任何地方浮动。

然后,我们的Controller动作填充ViewData键和另一个页面内的partial部分检查是否存在该键,并使用该键代替ViewData.Model。它使局部工作在任何需要的地方,并保持ViewModel清洁。通过使用常量,我们可以避免原始字符串到处。

0

使用ActionFilter使用所需的菜单信息填充ViewData。仅将它应用于类和/或方法(可能在基本Controller类上,如果需要的话)。在Controller上创建一些扩展方法,用于强制类型访问ViewData中的数据(如果稍后更改其存储位置,则透明)。

我最近用类似的方法做了a blog post(我需要一个赞助商名单来显示在每一页上)。这可能有助于指引您朝正确的方向发展。

3

您使用的是基本控制器吗?我发现使用一个,并重写OnActionExecuting方法帮助我有一个中心位置来保留我所有的常见页面逻辑。

0

只需添加到此,RenderAction被添加到MVC2 Beta。