我想要实现"更改验证器"。
我在后端使用实体框架,在前端使用角度。
通过WebApi进行通信。
由于许多原因,客户端将(new \Exception)->getTraceAsString();
和其他属性发送给我的控制器。
此列表可以包含许多可以从用户修改的对象。
所以,如果List<DepartmentSettingDto>
没有对来自db的数据进行任何更改,我不想更新数据库。
我想要这样的东西:
DepartmentSetting
是否可以编写扩展方法或类似的内容以避免保存未经修改的更改? 提前谢谢!
答案 0 :(得分:1)
扩展方法需要您遍历对象的属性以检查它们是否不同。更好的解决方案是重载Equals
(和GetHashCode
)并在更新数据库之前测试相等性。请查看this SO post,了解有关如何重载这些方法的详细信息。
如果您可以控制前端,其他一些内容可能会有所帮助。在这种情况下,可能的方法是让前端监视任何属性的更改,这可能会改变并将该标志与DTO一起发送给您。即在可能发生更改的所有HTML元素上放置一个CSS类,并将jQuery处理程序挂钩到它们。在第一次更改发生后,您可以将其分离。这样,您甚至不需要查询数据库中的此特定记录以检查是否相等 - 如果前端如此,则只发出更新。
这就是我的意思:
<input type="hidden" id="isThereChanges" value="false" />
<div>
<input type="text" class="editor-field" />
<input type="text" class="editor-field" />
<input type="checkbox" class="editor-field" />
<input type="radio" class="editor-field" />
</div>
<script>
$(document).ready(function() {
$(".editor-field").on("change", ChangeDetected);
});
function ChangeDetected() {
$(isThereChanges).val(true);
$(".editor-field").off("change", ChangeDetected);
}
</script>
这适用于隐藏字段,但是如果在将AJAX请求发送到WebAPI之前基于检查没有更改,则可以将其替换为DTO中的字段,甚至不用打扰Web服务器。 ..