MVC ActionMethod看起来有点像这样……
public ActionResult Create(viewmodelObject model) { if(ModelState.IsValid) { // ... var member = membershipRepository.GetMember(User.Identity.Name); // do stuff with member // update member } }
提出了很多解决方案,但是我找到了C#lock语句,并尝试了一下,所以我改变了我的代码看起来像这样……
public ActionResult Create(viewmodelObject model) { if(ModelState.IsValid) { // ... var member = membershipRepository.GetMember(User.Identity.Name); lock(member) { // do stuff with member // update member } } }
有效!我的测试人员都不能重现这个bug了!我们一直在抨击它超过一天,没有人能找到任何缺陷.但我对这个关键字并不是那么经验.我再次查看以澄清……
The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object,executing a statement,and then releasing the lock
好的,这是有道理的.这是我的问题.
这太简单了
这个解决方案看似简单,直接,清晰,高效和干净.这太简单了.我知道比认为复杂的东西更简单的解决方案更好.所以我想问更有经验的程序员……
有什么不好的事情我应该知道吗?
解决方法
这不起作用:
public IActionResult Submit(MyModel model) { lock (model) { //will not block since each post generates it's own instance } }
你的例子可行.这完全取决于是否在nhibernate中启用了二级缓存(从而返回相同的用户实例).请注意,它不会阻止任何内容发布到数据库,只是每个帖子将按顺序保存.
更新
另一个解决方案是添加return false;按下时按下提交按钮.它会阻止按钮多次提交表单.
这是一个jquery脚本,将为您解决问题(它将通过所有提交按钮,并确保它们只提交一次)
$(document).ready(function(){ $(':submit').click(function() { var $this = $(this); if ($this.hasClass('clicked')) { alert('You have already clicked on submit,please be patient..'); return false; } $this.addClass('clicked'); }); });
UPDATE2
请注意,jquery代码在大多数情况下都有效,但请记住,任何具有一点编程知识的用户都可以使用例如HttpWebRequest来向您的Web服务器发送垃圾邮件.这不太可能,但可能会发生.我要说的是,你不应该依赖客户端代码来处理问题,因为它们可以被规避.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。