asp.net-mvc - 在 ASP.NET MVC 中将引用数据加载到 View 模型中的可靠方法

标签 asp.net-mvc design-patterns data-binding dependency-injection

我想要一种方法将引用数据加载到 View 模型中与 Controller 分开。目前,我有一个 View 模型,其中包含所选值和引用数据的属性:

public IEnumerable<SelectListItem> DayTypes { get; set; }
public int DayTypeId { get; set; }

并且数据是从 Controller 操作中的相关存储库填充的:

model.DayTypes = _dayTypeRepository.GetAll().ToSelectList(d => d.Description, d => d.Identifier.ToString());

我想改变这一点,因为它会用大量的存储库和代码污染 Controller ,而这些存储库和代码不是其关注的核心。所有这些依赖项使 Controller 的单元测试变得很痛苦。

解决此问题的一种可能方法是让 View 模型类进行加载,这需要自定义模型绑定(bind)器使用 IoC 容器来实例化它们以提供存储库依赖项。这是一个好的选择吗?

我认为很好的另一种方法在 CodeCampServer 中有所暗示。但不完整并注释掉涉及 View 模型中字段的属性:

[SelectListProvided(typeof(AllDaysSelectListProvider))]
public IEnumerable<SelectListItem> DayTypes { get; set; }

但是,我正在努力弄清楚如何以一种不需要对 MVC 框架进行重大重新配置的方式来实现这一点。

如何解决这个问题?

编辑:我想保留强类型 View 并避免将数据填充到 View 数据中。

进一步编辑:我还想要一个理想地独立于模型的解决方案,我的意思是,如果多个 View 模型需要相同的引用数据,则可以使用单段代码来实现。 Matt 的方法很有趣,但与 View 模型紧密耦合。

最佳答案

我将使用一个服务层,该服务层将返回一个 POCO 对象,我将其映射到 View 模型。所以我的 Controller 操作将如下所示:

public ActionResult Index(int id)
{
    var model = _service.GetModel(id);
    var viewModel = Mapper.Map<Model, ViewModel>(model);
    return View();
}

我也喜欢使用 action filters to avoid the mapping code一切从头再来:

[AutoMap(typeof(Model), typeof(ViewModel))]
public ActionResult Index(int id)
{
    var model = _service.GetModel(id);
    return View(model);
}

这样,只有服务与 CRUD 存储库对话,而 Controller 与服务和映射层对话。

关于asp.net-mvc - 在 ASP.NET MVC 中将引用数据加载到 View 模型中的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192724/

相关文章:

asp.net-mvc - Stackify 前缀中未跟踪的应用程序代码是什么

php - 如何实现工厂设计模式

java - xjc 仅适用于架构的一部分

asp.net - 具有 > 1 个参数的 ASP MVC 路由

c# - MVC ASP 3 表连接然后显示结果

oop - 何时在 OOP 中使用单例?

java - 处理多种文件格式的转换,避免耦合

javascript - 为什么我不能将数组索引双向绑定(bind)到 AngularJs 中的模型?

c# - DepencyProperty 未通过 UserControl 上的绑定(bind)进行更新

c# - 如何使用 ASP.NET MVC 流式传输视频文件?