在视图中,我有以下内容:
@using (Html.BeginForm())
{
<input type="submit" id="savebtn" value="Save" onclick="saveLayout()"/>
}
<script type="text/javascript">
function saveLayout() {
$.ajax({
url: '/Page/SaveFaces/',
data: {
/* layout data of the page, irrelevant */
},
type: 'post',
success: function () {
}
});
return false;
}
</script>
上面的代码执行以下操作,简单地将用户重定向到他们来自的URL(它也应该保存数据,但为了简单起见,我删除了这一部分,因为它不影响问题):
[HttpPost]
public ActionResult SaveFaces(string items)
{
return Redirect(Request.UrlReferrer.AbsoluteUri);
}
然后,由于重定向,我们回到这个非常标准的模型获取操作:
public ActionResult Index(int id = 0)
{
var page = db.Pages.Find(id);
if (page == null) return HttpNotFound();
return View(page);
}
问题是最后一个动作被调用了两次。
我已经尝试删除AJAX调用并进行正常的POST操作,问题就消失了。然而,我试图发送的数据只能通过jQuery脚本获得,我不能把它们放在表单中。我只能使用AJAX方法。
我能做些什么来防止动作被击中两次吗?
我看你用的是jQuery
。你能试试这个吗?(注意,您可能必须绑定form
提交事件而不是输入按钮,或者两者都绑定)
@using (Html.BeginForm())
{
<input type="submit" id="savebtn" value="Save" >
}
<script type="text/javascript">
$("#savebtn").submit(function saveLayout(event) {
// The magic that prevents post.
event.preventDefault();
$.ajax({
url: '/Page/SaveFaces/',
data: {
/* layout data of the page, irrelevant */
},
type: 'post',
success: function () {
}
});
return false;
}
</script>
如果你可以访问form元素,另一种方法是:
<form onsubmit="javascript: return false;">
虽然这可能有点特定于我的场景,但我只是找到了一个可接受的解决方案。由于所有数据都是通过jQuery提供的,所以我完全删除了表单,并用一个简单的链接替换了提交按钮。
那么,这个就消失了:
@using (Html.BeginForm())
{
<input type="submit" id="savebtn" value="Save" />
}
而这里是:
<a onclick="saveLayout()" id="saveLink">Click to save.</a>
现在[HttpPost]
动作被击中,数据被保存,重定向动作也被击中,一次