10

如何在不使用 @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?

4

3 回答 3

20

您可以使用原始 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 项目的贡献者。

于 2013-08-17T22:16:47.103 回答
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内容)替换整个页面内容,但在大多数情况下会很好。

于 2013-08-17T22:03:25.667 回答
1

这将对服务器进行 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>");
}
于 2013-08-17T22:04:52.467 回答