asp.net-mvc – 为什么我们使用ViewModels?
|
我最近已经开始作为网页开发人员工作。我使用ASP.NET MVC 4和NHibernate。 在我的工作场所,我们严格使用视图模型来在控制器和视图之间传输数据。并且视图模型不应该包含模型的任何对象。 但是,即使我们可以直接将模型的对象发送到视图(在大多数情况下),我也会发现编写viewmodel类是重复冗余的。 例如,如果我想显示一个订单,我可以在控制器的动作中做到这一点 – return View(Repository.Get<Order>(id)); 但是,我必须编写一个视图模型,用提取的顺序填充它,然后将其传递给视图。 所以,我的问题是,当我们可以使用模型的对象时,编写viewmodels的目的是什么? 解决方法对于较小的项目,你是对的。我听到你的观点和同情 – 然而有很好的理由,这种粗暴和重复的工作,特别是在更大和更复杂的应用中:>在控制器的操作中执行所有处理至关重要。但是,在您给出的示例中,Repository.Get方法可能会返回一个延迟评估的IQueryable对象,这意味着在评估视图之前不会打击数据块。由于种种原因,这是坏的。 (解决方法是在控制器中调用.ToList)。 用户的EF Model对象表示其数据库中的实体,因此可能如下所示:User {UserId,UserName,PasswordHash,PasswordSalt,EmailAddress,CreatedDate},而“用户详细信息”页面上的字段将为User { UserId,UserName,Password,ConfirmYourPassword,EmailAddress},你看到区别吗? Ergo,您不能使用EF用户模型作为视图模型,您必须使用单独的类。 >模型操纵的危险:如果让ASP.NET MVC(或任何其他框架)将模型绑定到传入的HTTP POST Request,那么(以上面的用户详细信息示例),用户可以通过伪造UserId来重置任何人的密码属性值。 ASP.NET将在绑定期间重写该值,除非您特别对其进行清理(这将与使用个人ViewModels一样诡异),否则此漏洞仍将保留。 在你的情况下,我会与你分享一些轻微的解决办法,但请注意前提条件: >您的意见可以完全信任 那么你可以这样做: >将所有单向,非表单相关的数据放入ViewData集合中,或将MVC 4中的ViewBag(甚至是一个通用的ViewData< T>如果您是硬核的)。这对于存储HTML页面标题和与主页面共享数据非常有用。 但是请谨慎使用此方法,因为它可能会导致不一致。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET WebSite发布与复制?
- asp.net – CORS错误 – 请求的资源上没有“Access-Control
- asp.net-mvc – ASP.NET MVC报告
- 如何使用ASP.NET MVC Web API OData链接到Razor中的OData集
- Asp.Net Core中WebSocket绑定的方法详解
- model-view-controller – 比较Dates DataAnnotations验证a
- Crystal Reports 13和Asp.Net 3.5
- asp.net – UpdatePanel异常处理
- asp.net-mvc – 如何使用ASP.NET MVC 3编辑IEnumerable?
- 防止IIS卸载ASP.Net站点
- asp.net-mvc-2 – 我可以从global.asax重定向到控
- asp.net-mvc – 为什么我在带有godaddy服务器的M
- asp.net – 查找应用程序根URL而不使用
- asp.net – 由于其保护级别,未声明变量可能无法访
- asp.net-mvc-3 – MVC3:如何在HtmlHelper扩展中
- asp.net-mvc – 使用ASPX View Engine与MVC 5
- asp.net-mvc – 如何在asp.net mvc中创建一个弹出
- asp.net-mvc – 在MVC4中为ViewModel设置默认值的
- asp.net – 你可以添加一个HtmlGenericControl的
- asp.net-core – 如何在部署asp.net核心应用程序
