我是 ASP.NET 的新手,所以我的问题可能很愚蠢,并且受到多年使用 Java/JSF 的影响。
我想使用带有 MVC3 和 Entity Framework 4.1 的 ASP.NET 来实现一个 Web 应用程序。由于它是一个业务应用程序,因此它应该通过防止数据操作和并发来保证安全。
因此,我计划使用实体框架支持的乐观锁定。但是当谈到使用 MVC 范式及其提供的选项时,我不确定如何实现上述安全方面。
例子
我有一个具有实体类型“客户”的域模型,它具有属性
- ID(数据库PK)
- 姓名
- 生日
- 版本(用于乐观锁定)
为了准备视图以编辑其数据,我另外使用具有以下属性的视图模型“customerView”
- 姓名
在控制器中,我从数据库加载特定记录,将值传输到视图模型并将其放入强类型视图中。这很好用 - 值显示在 Web 表单中,我可以发回更改。由于视图模型不包括 ID 和版本(导致不是回发的一部分),我无法将值映射回域模型,因为它在请求-响应-生命周期期间丢失。
当然,我可以将 ID 和版本添加为隐藏的输入字段,因为它启用了数据操作,所以我想避免使用它。有人可能会在发回数据之前更改 ID 或版本,这可能会导致不良行为,因为我无法将发回服务器的数据与传递到 Web 表单的数据(尤其是 ID 和版本)进行比较。
我认为一种方法是存储我在会话中显示编辑视图之前获取的数据记录/域模型(或至少记录的 ID),以避免来回发送不需要的字段,尽管我知道这不是最好的方法并且可能会影响应用程序的性能。使用另一个会话状态然后使用默认状态,例如 SQL Server 怎么样?这将能够保存至少一个数据库操作,因为我不必再次从数据库中加载记录来传输视图模型中的值。我可以从会话中获取域模型记录,甚至可以检查数据操作。
我希望这个例子能说明我面临的问题。
也许有更好的方法来解决这些问题。也许我完全糊涂了;)