2012-01-20 4 views
4

Мое действие контроллера выполняется дважды. 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> 
    } 
} 

Код JavaScript для btnGo выглядит следующим образом:

$("#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); 
    } 

Единственное, что выглядит необычно для меня, это то, что URL-адрес, который вы увидите, начнется как [Website]/Thing/ThingFinancials/47, а после отправки URL будет [Website]/Thing/ConfirmThing?ThingID=47.

(Если вам интересно, почему название Действие не совпадает с именем View, это потому, что существует множество форм метки на ThingFinancials, и все они не могут иметь такое же имя действия.)

ли там Server.Transfer происходит за кулисами или что-то в этом роде?

+0

Shoudn't your FormMethod.Показать публикацию? –

+0

@BryanNaegele Я пробовал это в обоих направлениях. Проблема сохраняется с обоими из них. –

ответ

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(); 
    }); 
+0

Вот и все! Я использовал тег

+0

Рад помочь. :-) –

1

Ваш int thingID - это параметр строки запроса, который остается с запросом. В конце ActionResult ConfirmThing(int thingID) все, что вы делаете, возвращает представление. Если вы предпочитаете видеть чистый URL ([Веб-сайт]/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 }); 
    } 
+0

Это, безусловно, более чистый способ сделать это. Но у меня все еще есть проблема с подтверждением того, что ConfirmThing выполняется дважды, без каких-либо причин, которые я смог увидеть. –

0

Это из-за вашего мероприятия Jquery просто добавить stopImmediatePropagation() на мероприятие Jquery.

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