asp.net-mvc – 在MVC中使用ViewModels进行POST操作
目前,我将域对象传递给我的视图,并直接从POSTs绑定到它们。大家都说这是坏的,所以我试图添加ViewModel的概念。
不过,我无法找到一种非常优雅的方法,而且我想知道其他人的解决方案是不会以一个非常混乱的控制器动作结束。 一些“添加人”功能的典型过程如下所示: >为表示空白Person视图模型的视图发出GET请求 在控制器中执行所有操作(忽略GET)当然不是SRP或DRY。 我试图想到一种打破这个过程的方式,以便它遵守SRP,是干净,模块化和最重要的可测试。 人民解决这个问题是什么? 我一直在尝试使用自定义的控制器操作 – 调用者来将问题分解成各种方法,智能模型绑定器和简单的强力,但是我还没有遇到一个满意的解决方案。 美国因为它增加了这么多的复杂性,说服我为什么我甚至需要打扰 解决方法
我感觉到同样的不适。我唯一的办法是做到以下几点:
>创建一个绑定和验证视图模型的绑定 动作方法如下所示: public ActionResult Whatever(TViewModel viewModel,TEntity entity) { return Save(viewModel,entity); } 基本控制器具有通用定义,如下所示: public abstract BaseController<TEntity,TViewModel> where TEntity : Entity where TViewModel : ViewModel 构造函数有两个依赖关系,一个用于实体存储库,另一个用于模型映射器,如下所示: protected BaseController(IRepository<TEntity> repository,IMapper<TEntity,TViewModel> mapper) 有了这个,你可以编写一个受保护的Save方法,可以通过控件在子类中的动作来调用,就像这样: protected ActionResult Save(TViewModel viewModel,TEntity entity) { if (!ModelState.IsValid) return View(viewModel); _mapper.Map(viewModel,entity); if (!entity.IsValid) { // add errors to model state return View(viewModel); } try { _repository.Save(entity); // either redirect with static url or add virtual method for defining redirect in subclass. } catch (Exception) { // do something here with the exception return View(viewModel); } } 就可测试性而言,您可以测试传递有效/无效视图模型和实体的保存方法。您可以分别测试模型映射器的实现,视图模型的有效状态和实体的有效状态。 通过使基本控制器通用化,您可以在域中的每个实体/ viewmodel组合中重复此模式,如果您正在创建许多控制器来执行相同的操作。 我很有兴趣听到别人对此的评论。伟大的问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp-classic – 是代码页65001和utf-8同样的东西吗?
- 美国美孕价格多少
- asp.net-mvc – 使用GUID作为ASP.NET MVC数据库中的ID
- JavaScript- jquery easyui 可编辑表格插件 easyui.editgr
- ASP.NET Core中Server.Transfer的替代方案
- asp.net-mvc-3 – ASP.Net MVC 3 ViewModel数据注释
- asp.net-mvc-4 – 重定向到动作,参数在mvc中始终为空
- ASP.NET核心角度SPA模板将自定义引导主题添加到webpack.con
- asp.net – ASP .net MVC调用默认控制器和操作vs设置启动页
- 如何使用UTC时间(asp.net和ajax)向用户呈现本地时间