我的控制器操作正在执行两次。 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在幕后发生,或类似的事情?
答案 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();
});