【问题标题】:Strongly typed custom baseviewdata in a custom basecontroller自定义基本控制器中的强类型自定义基本视图数据
【发布时间】:2010-07-26 06:36:54
【问题描述】:

在我的项目中,我本着以下精神强类型化了 viewdata:

AppleListViewData : ViewDataDictionary
  + SelectedTheme
  + ThemeList
  + SelectedApple
  + AppleList

前四个在所有视图数据中重新出现,因为它们在 site.master 中使用
为了保持干燥,我将它们提升为另一个继承自的 BaseViewData 类。

现在我所有的控制器都需要填写这些属性。同样,为了保持干燥,我为我的控制器创建了一个 BaseController 来承担这项工作。

BaseController : Controller
  + new ViewData : BaseViewData
  + FetchThemes
  + FetchSelectedTheme

BaseController.ViewData 是新的,因为它隐藏了 Controller.ViewData 所有控制器都负责在构造函数时更新视图数据。

我实际上是在隐藏现有的 viewdata 系统并用我自己的替换它。
这就是我觉得我做错了什么的地方。 有什么建议可以让我以更优雅的方式完成这项工作吗?

【问题讨论】:

  • 在我看来,您似乎重新发明了强类型视图。我不明白这一点。如果您愿意,您已经可以拥有一个强类型模型。
  • 但是如何使用现有的强类型视图和基本视图的概念呢?
  • 如果需要,您可以使用动作过滤器 / 在执行结果之前注入通用视图数据。
  • 你的意思是以弱的方式添加它们?
  • 不,您可以以任何您喜欢的方式添加它们——添加到模型属性、自定义属性等等。如果这是你想要的,那就是弱,否则就是强。关键是不要在控制器中执行此操作,而是在操作过滤器中执行此操作,因为它遵循 SRP 并且不会创建并行层次结构。

标签: c# .net asp.net-mvc oop


【解决方案1】:

如果这些项目总是在您的母版页中,那么提取使用数据的控件并让控制器处理每个控件可能是有意义的。然后在您的母版页中使用Html.RenderAction 并使用您的数据输出用户控件。这样,您的控制器就不会被有关主题视图的信息弄得一团糟,任何阅读您的代码的人都可以轻松看到数据的来源

例子

public class ThemeController : Controller{
  public ActionResult ThemeDropDown(){
     return PartialView(new ThemeViewModel(){ SelectedTheme = ..., ThemeList = ... })
  }
}


public class AppleController : Controller{
  public ActionResult AppleStuff(){
     return PartialView(new AppleViewModel(){ Apple = ..., AppleList = ... })
  }
}


<%= Html.RenderAction("ThemeDropDown", "Theme") %>    
<%= Html.RenderAction("AppleStuff", "Apple") %>

【讨论】:

  • 这确实可以替代我的系统。看看我是否可以在我的真实应用中做到这一点:)
猜你喜欢
  • 2020-10-22
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多