Action在提交时执行两次

时间:2012-01-20 22:50:48

标签: asp.net-mvc-3

我的控制器操作正在执行两次。 Fiddler显示两个请求和响应,第一个有一个图标,表示“会话被客户端,Fiddler或服务器中止”。

但我无法弄清楚这是怎么回事,或者为什么。

以下是具体细节:

我有一个视图(ThingFinancials)的部分,如下所示:

@{ using (Html.BeginForm("ConfirmThing", "Thing", null, FormMethod.Get, new { id = "frmGo" }))
   {
       @Html.HiddenFor(model => model.ThingID)
    <button id="btnGo">
        Thing is a Go - Notify People</button>
   }
}

btnGo的javascript看起来像这样:

    $("#btnGo").click(function () {
        var form = $("#frmGo");
        form.submit();
    });

动作(剥离)看起来像这样:

   public ActionResult ConfirmThing(int thingID)
   {
        [do some database stuff]
        [send some emails]

        var financials = GetFinancials(thingID);
        return View("ThingFinancials", financials);
   }

对我而言,唯一不寻常的是,您看到的网址最初为[Website]/Thing/ThingFinancials/47,提交后网址为[Website]/Thing/ConfirmThing?ThingID=47

(如果您想知道为什么Action名称与View名称不匹配,那是因为ThingFinancials上有多个表单标签,并且它们不能都具有相同的操作名称。)

是否有Server.Transfer在幕后发生,或类似的事情?

3 个答案:

答案 0 :(得分:4)

如果您使用提交按钮,则需要在使用javascript提交时取消默认行为,否则您将提交两次。试试这个:

 $("#btnGo").click(function () {
        var form = $("#frmGo");
        // event.preventDefault(); doesn't work in IE8 so do the following instead
        (event.preventDefault) ? event.preventDefault() : event.returnValue = false;
        form.submit();
    });

答案 1 :(得分:1)

您的int thingID是一个与请求保持一致的查询字符串参数。在ActionResult ConfirmThing(int thingID)结束时,您所做的只是返回一个视图。如果您更愿意看到干净的URL([Website] / Thing / ThingFinancials / 47),您可以进行以下更改。

   public ActionResult ConfirmThing(int thingID)
   {
        [do some database stuff]
        [send some emails]

        // This logic is probably in the 'ThingFinancials' action
        // var financials = GetFinancials(thingID);

        // I'll assume we're in the same controller here
        return RedirectToAction("ThingFinancials", new { thingID });
   }

答案 2 :(得分:0)

这是因为你的jquery事件只是将stopImmediatePropagation()添加到你的jquery事件中。

 $("#btnGo").click(function (event){
event.stopImmediatePropagation();
});