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