0

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

@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 方法。

我能做些什么来防止动作被两次击中吗?

4

2 回答 2

1

I see you are using jQuery. Can you try this instead? (Note you may have to bind the the form submit event rather than the input button, or both)

@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>

Also if you have access to form element, another way:

<form onsubmit="javascript: return false;">
于 2013-05-28T14:41:14.920 回答
0

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

所以,这消失了:

@using (Html.BeginForm())
{    
    <input type="submit" id="savebtn" value="Save" />
}

而这是代替:

<a onclick="saveLayout()" id="saveLink">Click to save.</a>

现在该[HttpPost]动作被击中,数据被保存并且重定向到的动作也被击中,一次。

于 2013-05-28T15:02:31.913 回答