Публикация формы без @HTML.Beginform и использование JQuery (ajax) в asp.net MVC

Как заполнить форму без использования @HTML.Beginform и вместо этого использовать JQuery Ajax? Сейчас я попробовал:

    var postData = { form1: username, form2: password };

    $.ajax({
        type: "POST",
        url: '/Controller/Method',
        data: postData,
        dataType: "json",
        traditional: true
    });

Но после публикации браузер не перейдет к правильному виду. Конечно, я правильно вернул View() в контроллер. Используя Fiddler, я вижу, что он правильно размещен и ответ тоже верен...

У меня есть, чтобы использовать @HTML.Beginform или я могу сделать это с помощью Ajax?

Ответ 1

Вы можете использовать либо тег HTML <form>, либо хелпер @HTML.BeginForm. Вот пример, используя только HTML

Готовое решение:

<form action"/Controller/Method" method="POST" id="signInForm">
    <input type="text" name="form1" />
    <input type="text" name="form2" />
    <input type="submit" value="Sign in" />
</form>

$( function() {
    $( 'signInForm' ).submit( function( evt ) {
        //prevent the browsers default function
        evt.preventDefault();
        //grab the form and wrap it with jQuery
        var $form = $( this );
        //if client side validation fails, don't do anything
        if( !$form.valid() ) return;
        //send your ajax request
        $.ajax( {
            type: $form.prop( 'method' ),
            url: $form.prop( 'action' ),
            data: $form.serialize(),
            dataType: "json",
            traditional: true,
            success: function( response ) {
                document.body.innerHTML = response;
            }
        });
    });
});

Я рекомендую использовать @Url.Action для установки URL-адреса вашего действия формы. Таким образом, маршрутизация может сгенерировать ваш URL.

<form action"@Url.Action("Method", "Controller")" method="POST" id="signInForm">
    <input type="text" name="form1" />
    <input type="text" name="form2" />
    <input type="submit" value="Sign in" />
</form>

Это немного более продвинутый, но я бы попытался использовать что-то вроде Take Command для управления вашими вызовами jQuery Ajax.

Отказ от ответственности, я являюсь участником проекта TakeCommand.

Ответ 2

Когда вы используете @Html.BeginForm, вывод HTML:

<form method="POST" action="/Controller/Method">

И когда вы отправляете эту форму, браузер обрабатывает ее так же, как и другую навигацию по страницам (только с использованием метода POST), поэтому ответ загружается в родительский фрейм.

Но когда вы инициируете запрос Ajax, вам нужно обработать ответ с сервера (как правило, используя функцию обратного вызова).

Если вы хотите имитировать регулярное поведение представления формы, это будет примерно так:

$.ajax({
    type: "POST",
    url: '/Controller/Method',
    data: postData,
    dataType: "json",
    traditional: true,
    success: function(response)
    {
        document.body.innerHTML = response;
    }
});

Это не заменит весь контент страницы ответом (только содержимое BODY), но в большинстве случаев это будет нормально.

Ответ 3

Это сделает сообщение xhr на сервере и вернет представление как данные (ответ) Он не будет перемещаться, если он вернет html, вам нужно установить правильный тип данных в своем запросе, чтобы сообщить, что вы ожидаете возвращения html с сервера:

Учитывая, что ваше действие возвращает html, вы можете поместить возвращенный html на свою страницу в свою функцию успеха.

postData = "{'ID':'test'}";
$.ajax({
    type: "POST",
    url: '/Home/Test',
    data: postData,
    dataType: 'html',
    contentType: 'application/json',
    traditional: true,
    success: function (data) {
        $("#yourdomelement").html(data);
    }
});

В вашем действии

public ActionResult Test([FromBody]PostData id)
{
    return Content("<p>hello</p>");
}