在Web Api 2中,Ajax成功事件并未触发

时间:2017-09-07 17:41:10

标签: javascript jquery asp.net ajax asp.net-web-api2

在我的ASP.Net Web Api 2应用程序中,当我点击提交按钮时,我使用AJAX帖子将注册表单数据发送到服务器。

function click_form() {
var formData = JSON.stringify({
    Name: $('#regInputName').val(),
    SecondName: $('#regInputLastName').val(),
    Email: $('#regInputEmail').val(),
    Username: $('#regInputUsername').val(),
    Password: $('#regInputPassword').val(),
    Contact: $('#regInputContact').val(),
});

$.ajax({
    url: '/api/Account/registration',
    method: 'POST',
    data: formData,
    contentType: 'application/json;charset=utf-8',
    dataType: 'json',
    cache: false,
    success: function () {
        alert("Success");
    },
    error: function () {
        alter('Error');
    }
});
}

这是我的Web Api控制器,如果用户名不存在,我将重新启动HttpStatusCode.OK,如果用户名已经存在,则返回HttpStatusCode.NotFound。

[HttpPost]
[Route("api/Account/registration")]
    public HttpResponseMessage registration([FromBody] UserRegModel user)
    {            
        if (!usernames[0].Contains(user.Username))
        {
            User u = new User(){/*....*/}
            /*... updating database ... */

            HttpContext.Current.Session["user"] = u;        
            return new HttpResponseMessage(HttpStatusCode.OK);
        }
        return new HttpResponseMessage(HttpStatusCode.NotFound);
    }

我的控制器每次返回OK或NotFound但Ajax事件成功和错误永远不会被触发。

有人知道这是什么问题吗?

2 个答案:

答案 0 :(得分:0)

usernames的列表/数组很可能不包含已发布的值。 这将导致404状态代码由ajax设置中的错误回调处理。

但是,在错误回调中,您有一个alter()应该是alert()的typeo,如果您更改了,那么很可能会显示错误消息。

答案 1 :(得分:0)

我发现了一些问题 -

  • 使用type: 'POST'代替method: 'POST'
  • 如果Action方法没有返回任何内容,则不需要dataType: 'json'。否则,将调用错误函数而不是成功。

修正:

<button type="button" onclick="click_form()">Post Form via Ajax</button>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    function click_form() {
        var formData = JSON.stringify({
            Name: 'John Doe',
            SecondName: 'Jonny',
            Email: 'johndoe@example.com',
            Username: 'johndoe',
            Password: '123456',
            Contact: 'Jannet Doe'
        });

        $.ajax({
            url: '/api/Account/registration',
            type: 'POST',
            data: formData,
            contentType: 'application/json;charset=utf-8',    
            cache: false,
            success: function (result) {
                console.log(result);
            },
            error: function (result) {
                console.log(result);
            }
        });
    }
</script>

如果您使用Web API 2,则可以使用Ok()NotFound(),并返回IHttpActionResult。与旧方法相比,它更清晰,易读。

[HttpPost]
[Route("api/Account/registration")]
public IHttpActionResult Registration([FromBody] UserRegModel user)
{
    if (!usernames[0].Contains(user.Username))
    {
        ...
        return Ok();
    }
    return NotFound();
}

仅供参考: 我测试了上面的代码,它运行正常。因此,在您完成复杂的业务逻辑之前,请尝试返回Ok()以确保Ajax正常工作。