在ASP.NET中,带有AJAX的POST/Redirect/GET序列两次命中重定向到操作

在ASP.NET中,带有AJAX的POST/Redirect/GET序列两次命中重定向到操作,asp.net,jquery,Asp.net,Jquery,在视图中,我有以下内容: @using (Html.BeginForm()) { <input type="submit" id="savebtn" value="Save" onclick="saveLayout()"/> } <script type="text/javascript"> function saveLayout() { $.ajax({ url: '/Page/SaveFaces/',

在视图中,我有以下内容:

@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>
然后,由于重定向,我们回到这个非常标准的模型获取操作:

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
。你能试试这个吗?(注意,您可能需要绑定
表单
提交事件,而不是输入按钮,或者两者都绑定)

@使用(Html.BeginForm())
{    
}
$(“#savebtn”).submit(函数saveLayout(事件){
//阻止post的魔力。
event.preventDefault();
$.ajax({
url:“/Page/SaveFaces/”,
数据:{
/*页面的布局数据,不相关*/
},
键入:“post”,
成功:函数(){
}
});
返回false;
}
另外,如果您有权访问表单元素,另一种方式:

<form onsubmit="javascript: return false;">

虽然它可能有点特定于我的场景,但我刚刚找到了一个可接受的解决方案。由于所有数据都是通过jQuery提供的,所以我完全删除了表单,并用一个简单的链接替换了submit按钮

所以,这就消失了:

@using (Html.BeginForm())
{    
    <input type="submit" id="savebtn" value="Save" />
}
@使用(Html.BeginForm())
{    
}
这一点已经落实到位:

<a onclick="saveLayout()" id="saveLink">Click to save.</a>
点击保存。

现在,
[HttpPost]
操作被命中,数据被保存,重定向到操作的操作也被命中一次。

事实上,我正在使用jQuery。我尝试过你的方法,但现在当我单击按钮时脚本根本不运行。可能使用
代替
。单击()
事件代替
。提交()
@using (Html.BeginForm())
{    
    <input type="submit" id="savebtn" value="Save" />
}
<a onclick="saveLayout()" id="saveLink">Click to save.</a>