Asp.Net MVC Ajax.BeginForm не отправляет через Ajax - PullRequest
14 голосов
/ 18 декабря 2010

Я получил мою форму следующим образом

<div id="contact-form" class="hidden" title="Online Request Form">
    @Using (Ajax.BeginForm("Contact", "Main",
                          Nothing,
                          New AjaxOptions With {.UpdateTargetId = "status", .HttpMethod = "post"},
                          New With {.id = "contactUs"}))
        @<div>
            @Html.LabelFor(Function(m) m.Name)<br />
            @Html.TextBoxFor(Function(m) m.Name)<br />
            @Html.LabelFor(Function(m) m.Phone)<br />
            @Html.TextBoxFor(Function(m) m.Phone)<br />
            @Html.LabelFor(Function(m) m.Email)<br />
            @Html.TextBoxFor(Function(m) m.Email)<br />
            @Html.LabelFor(Function(m) m.Question)<br />
            @Html.TextAreaFor(Function(m) m.Question)<br />
            @Html.LabelFor(function(m) m.Security)<br />
            @Html.TextBoxFor(Function(m) m.Security)<br />
            <noscript>
                <input type="submit" name="submit" value="Ok" />
            </noscript>
            @Html.ValidationSummary("Oops, please correct the errors.")<span id="status">@TempData("status")</span>
        </div>
    End Using
</div>

И я открываю его в модальном окне jQuery-UI

<script>
    $(function () {

        // Open the modal dialog from the div.contact-us click event
        $('#contact-us').click(function () {
            $('#contact-form').dialog('open');
            return false;
        });

        // Manage the modal dialog behavior.
        $('#contact-form').dialog({
            modal: true,
            autoOpen: false,
            buttons: {
                Cancel: function () {
                    $(this).dialog('close');
                },
                Ok: function () {
                    $('form#contactUs').trigger('submit');
                }
            }
        });
    });

</script>

Когда я нажимаю кнопку «ОК», он отправляет сообщение на соответствующий контроллер, но не отправляет через AJAX

    ''# fix the StackOverflow code coloring issue.
    <HttpPost()>
    Function Contact(ByVal contactForm As Models.ContactForm) As ActionResult
        ViewData("Testimonials") = Helpers.GetTestimonials

        If ModelState.IsValid Then
            ''# Submit the email
            TempData("status") = "Thank you, we will be in touch"
        Else
            ''# Return False
            TempData("status") = "Oops, please correct the errors."
        End If


        If Request.IsAjaxRequest Then
            Return Content(TempData("status").ToString)
        Else
            Return View("Index")
        End If
    End Function

Что я делаю не так? После того как я отправлю форму, мой URL будет http://example.com/Main/Contact, что говорит мне о том, что IsAjaxRequest = false

EDIT

Даже когда я не использую кнопку «ОК» на jquery-ui и просто добавляю <input type="submit" name="submit" value="Ok" /> к форме, форма отправляет без Ajax

Ответы [ 2 ]

44 голосов
/ 18 декабря 2010

Есть ли у вас включенный jquery ajax-скрипт? Я заметил такое поведение, когда не включил его:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
2 голосов
/ 18 декабря 2010

Я некоторое время не работал с помощниками ASP.NET MVC AJAX, но я верю, что Ajax.BeginForm добавляет встроенный обработчик onsubmit в сгенерированную (HTML) разметку.

Если это так, то при вызове submit в этой форме программным способом (ваш jQuery, который вызывает событие submit) не будет вызываться функция onsubmit формы, которая, скорее всего, отменяет нормальное отправить действие и отправить форму через AJAX.

Для получения дополнительной информации о том, почему это происходит, проверьте этот связанный ответ .

В качестве альтернативы вы можете опубликовать форму через AJAX, используя

Я обнаружил, что любой из этих методов доставляет меньше хлопот, чем использование помощников Microsoft AJAX.

...