put方法通过JS(ajax) - 后端返回badRequest(无效模型)/ C#/ WebAPI / MVC

时间:2017-01-21 11:30:16

标签: javascript c# jquery ajax asp.net-web-api

我有以下问题: 我在我的MVC控制器中使用PUT方法

[HttpPut, Route("{id:int}")]
    public IHttpActionResult Update(int id, [FromBody]Student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        using (var ctx = new EfDbContext())
        {
            student.Id = id;
            ctx.Students.Attach(student);
            var dbEntry = ctx.Entry(student);
            dbEntry.State = EntityState.Modified;
            if (student.Grades != null)
            {
                foreach (var grade in student.Grades)
                {
                    ctx.Grades.Attach(grade);
                    var entry = ctx.Entry(grade);
                    entry.State = grade.Id == 0 ? EntityState.Added :
                        EntityState.Modified;
                }
            }

            ctx.SaveChanges();
        }
        return Ok();
    }

我也有我的javascript在localhost网站上使用HTML表单。

function addStudent() {
console.log($("#newStudent").serializeArray())
$.ajax({
    url: 'http://localhost:56658/api/api/students',
    type: 'post',
    dataType: 'json',
    data: $("#newStudent").serializeArray(),
    success: function (data) {
        $('#students').append(listItem(data));
    }
});

}

和我的editStudent脚本(这是问题)

function editStudent(id) {
console.log($("#newStudent").serializeArray())
$.ajax({
    url: 'http://localhost:56658/api/api/students/' + id,
    type: 'put',
    dataType: 'json',
    data: { id: id,student: $("#newStudent").serializeArray() },
    success: function (data) {
        $('#students').append(listItem(data));
    }
});

}

如您所见,我有两个几乎相同的脚本。现在,问题在于editStudent - 我的后端在我按下Web上的提交按钮时返回badrequest(所有文本字段都填充了有效数据)。添加学生工作正常(我也在POST方法中检查模型的有效性)。 “编辑”操作的表格是用于立即添加学生的表格的精确副本(为了确保我避免在字段ID等中出现任何拼写错误,所以我不期待那里的问题。

哪里可能是问题?在使用Postman进行测试时,Put工作正常,但我无法使用JS。

我会感激任何帮助 干杯

2 个答案:

答案 0 :(得分:0)

您在正文中传递了id,但在行动方法中,您只需要Student来自正文。

更改data中的ajax

data: $("#newStudent").serializeArray(), // pass only student

答案 1 :(得分:0)

为什么要使用put?

使用put,您希望在服务器上放置/替换特定资源。
在此URL下找不到资源,因此您收到错误请求。

基本上,请求根本不会路由到您的控制器方法。