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.net – 什么时候应该使用Page.DataBind()和Control.Dat
- 在ASP.NET(C#)中实现安全,独特的“一次性”激活URL
- asp.net – 正在生成无效的Webresource.axd参数
- 子文件夹中忽略ASP.NET web.config授权设置
- asp.net-mvc – 在Asp.NET MVC中以dd/mm/yyyy格式显示DateT
- asp.net-mvc – 属性似乎根本不起作用
- asp.net-mvc – ASP.NET MVC QueryString默认覆盖提供的值?
- asp.net-mvc – 在ASP.NET MVC中使用ASP.NET Web窗体UserCo
- asp.net – Oracle中的参数化查询问题
- asp.net-mvc – Html.Raw()在ASP.NET MVC Razor视图
- asp.net-mvc – “添加ASP.Net文件夹”未启用
- asp.net-mvc – MVC3区域中的相对内容路径
- .net – MultipartFormDataStreamProvider vs Ht
- asp.net – 请求标头的大小太长
- VS 2015预览缺少“ASP.NET 5 Web应用程序”项目类
- asp.net-mvc – ASP.NET MVC Html.RadioButton异
- asp.net-mvc – mvc4future无法在ASP.NET MVC 5中
- asp.net-mvc – 导出Excel文件以查看(MVC)
- asp.net-mvc – 带MVC结果的Response.Flush无效
- asp.net – 你的aspx页面中的内联代码是一个好习
