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-mvc – 实现MVC 5 IAuthenticationFilter
- ASP.net防止SQL注入方法
- asp.net-mvc – Autofac – 将属性注入asp.net mvc控制器
- asp.net-mvc-3 – 专门针对Azure的代码?
- ASP.NET Core的JWT的实现(自定义策略形式验证).md
- 在将所有websocket数据发送到客户端之前,ASP.NET关闭连接
- asp.net – 使用.NET和Jenkins的Selenium性能 – 如何分析和
- asp.net-mvc – Razor vs Webforms视图引擎,用于新的ASP.NE
- 如何在ASP.NET和C#中每个会话“临时”存储Web服务器上的图像
- 问题在ASP.NET中使用System.Web.Caching.Cache类
- asp.net-mvc – 在视图中创建DropDownListFor项
- asp.net – 如何直接在aspx布局页面中嵌入ShareP
- asp.net-mvc-3 – 在DEBUG或Debugger中运行时禁用
- asp.net – ascx中的Updatepanel刷新了整个控件
- asp.net – 从DropdownList SelectedItem获取属性
- asp.net – 找不到aspnet_regiis部分
- asp.net-mvc-3 – 为什么我的textBoxFor使用我的
- asp.net-mvc-3 – 带有Npgsql和Entity Framework
- asp.net-mvc-3 – 如何在WebGrid中隐藏列?
- asp.net-mvc-4 – 自定义错误在我的MVC 4应用程序