我目前正在做一个ASP.NET MVC项目。
团队中的一些开发人员希望将自动生成的数据库实体直接绑定到视图。
其他开发人员希望创建定制的ViewModel并将其绑定到视图。
客观地说,这两种方法的优缺点是什么?
(我所说的“数据库实体”指的是对象关系管理框架生成的自动生成的类,例如LINQ to SQL、Entity framework或LLBLGen)。
发布于 2012-06-08 05:59:39
到目前为止,感谢你的回答-它们对理解这两种方法的优缺点有很大帮助。我有一件事要补充,这是其他人没有提到的。
过度发布攻击
直接针对DB实体进行绑定的一个令人担忧的缺点是“过度发布攻击”。在这里,攻击者可以使用不比FireBug更高级的工具插入用户不能编辑但确实存在于DB实体上的表单域。
考虑一下“编辑我的个人资料”页面。您的视图可能如下所示:
@using(Html.BeginForm() {
<div>
@Html.LabelFor(x=> x.FirstName)
@Html.TextBoxFor(x=> x.FirstName)
</div>
<div>
@Html.LabelFor(x=> x.LastName)
@Html.TextBoxFor(x=> x.LastName)
</div>
<input type="Submit" value="Save" />
}它将呈现以下HTML:
<form action="/profile/edit" method="post">
<div>
<label for="FirstName">FirstName</label>
<input type="text" name="FirstName" value="" />
</div>
<div>
<label for="LastName">LastName</label>
<input type="text" name="LastName" value="" />
</div>
<input type="Submit" value="Save" />
</form>使用FireBug,攻击者只需在表单中插入一段HTML码:
<input type="hidden" name="IsAdmin" value="true" />...and突然间,用户能够以非常意想不到和有害的方式更改数据。
下面是一些更可怕的隐藏表单域:
<input type="hidden" name="ShoppingCart.Items[0].Price" value="0.01" />
<input type="hidden" name="BankAccount.Balance" value="1000000" />
<input type="hidden" name="User.Administrator.Password" value="hackedPassword" />唉哟!
信息来源:http://hendryluk.wordpress.com/tag/asp-net-mvc/
https://stackoverflow.com/questions/10928287
复制相似问题