Действие выполняется дважды при отправке - PullRequest
4 голосов
/ 21 января 2012

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

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

Есть ли за кадром передача Server.Terfer или что-то в этом роде?

Ответы [ 3 ]

4 голосов
/ 21 января 2012

Если вы используете кнопку отправки, вам нужно отменить поведение по умолчанию при отправке с помощью 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 голос
/ 21 января 2012

Ваш 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 });
   }
0 голосов
/ 22 апреля 2012

Это из-за вашего события jquery, просто добавьте stopImmediatePropagation() к вашему событию jquery.

 $("#btnGo").click(function (event){
event.stopImmediatePropagation();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...