当前位置: 首页 > 编程语言 > C#

在ASP.NETMVC3中使用视图模型分享

时间:2023-04-11 12:18:51 C#

在ASP.NETMVC3中使用视图模型我对视图模型比较陌生,在使用它们时遇到了一些问题。在这种情况下,我想知道最佳实践是什么……我将视图需要的所有信息都放入视图模型中。这是一个例子-请原谅任何错误,这是我头脑中的编码。publicActionResultEdit(intid){varproject=ProjectService.GetProject(id);if(project==null)//未找到的东西,可能重定向到404。varmodel=newProjectEdit();model.MapFrom(项目);//使用AutoMapper的扩展方法。返回视图(模型);如果屏幕只允许编辑一个或两个字段,那么当视图模型返回时(它应该),它会丢失相当多的数据。[HttpPost]publicActionResultEdit(intid,ProjectEditmodel){varproject=ProjectService.GetProject(id);if(project==null)//找不到东西,可能重定向到404。try{if(!ModelState.IsValid)returnView(model)//不会工作,视图模型不完整。模型.MapTo(项目);//使用AutoMapper的扩展方法。ProjectService.UpdateProject(项目);//为用户添加一条消息到临时数据。returnRedirectToAction("细节",new{project.Id});}catch(Exceptionexception){//为用户添加一条消息到临时数据。returnView(model)//不起作用,视图模型不完整。我的临时解决方案是从头开始重新创建视图模型,从域模型中重新填充它,将表单数据重新应用到它,然后照常进行。但这使得视图模型参数有些毫无意义。[HttpPost]publicActionResultEdit(intid,ProjectEditmodel){varproject=ProjectService.GetProject(id);if(project==null)//未找到的东西,可能重定向到404。//从头开始??重新创建视图模型。model=newProjectEdit();model.MapFrom(项目);//使用AutoMapper.try的扩展方法{TryUpdateModel(model);//重新应用表单data.if(!ModelState.IsValid)returnView(model)//这次视图模型完成了。模型。MapTo(项目);//使用AutoMapper的扩展方法。项目服务。更新项目(项目);//为用户添加一条消息到临时数据。returnRedirectToAction("细节",new{project.Id});}catch(Exceptionexception){//为用户添加一条消息到临时数据。returnView(model)//这次视图模型完成了。有没有更优雅的方式?编辑两个答案都是正确的,所以如果可以的话,我会奖励他们。然后向MJ点头,因为经过反复试验,我发现他的解决方案是最精简的。吉米,我仍然可以使用Google助理。如果我将需要显示的内容添加到视图包(或视图数据)中,就像这样...ViewBag.Project=project;然后我可以执行以下操作...@Html.LabelFor(model=>((Project)ViewData["Project"].Name)@Html.DisplayFor(model=>((Project)ViewData["Project"])。Name)有点麻烦,在某些情况下需要用System.ComponentModel.DisplayNameAttribute装饰域模型,但我已经做到了。我很乐意打电话给...@Html.LabelFor(model=>ViewBag.Project.Name)但动态会导致表达式出现问题。经过反复试验(又名代码,然后讨厌它),我目前的首选方法是:我只使用视图模型来绑定输入字段。所以在您的情况下,如果您的视图仅编辑两个字段,则您的视图模型将只有两个属性。对于填充视图所需的数据(下拉列表、标签等),我使用动态ViewBag。我相信显示视图(即用它需要显示的任何内容填充视图)和捕获发布的表单值(绑定、验证等)是两个不同的问题。我发现将填充视图所需的数据与从视图可能会变得混乱并经常创建您的情况。我不喜欢传递部分填充的对象。我不确定如何使用Automapper(用于将域对象映射到动态ViewBag),因为我还没有使用过它。我相信它有一个可能有效的DynamicMap方法?将已发布的强类型ViewModel自动映射到域对象应该没有任何问题。如果我理解正确,您的视图模型可能看起来与您的域实体非常相似。您提到视图模型可以返回大部分为空,因为只有某些字段是可编辑的。假设您有一个视图,其中只有几个字段可用于编辑(或显示),而这些是您应该在视图模型中提供的唯一字段。我通常为每个视图创建一个视图模型,并让控制器或服务处理用户的输入,并在进行一些验证后将其映射回域实体。这是一个关于视图模型最佳实践的线程,您可能会发现它很有用。编辑:您还可以在编辑/发布操作中接受与编辑/获取操作相关的不同视图模型。我相信只要模型活页夹可以处理这个问题,这就应该有效。以上就是C#学习教程:在ASP.NETMVC3中使用视图模型分享的全部内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注它。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: