【问题标题】:Post Objects collection to Web Api Controller将对象集合发布到 Web Api 控制器
【发布时间】:2019-03-26 05:08:50
【问题描述】:

我正在尝试使用 jquery 向 Web API 控制器发布 http 帖子,我正在向控制器发布一组对象,但是当到达服务器时,该数组为空。

javascript

        var url = "api/actuary/" + $("#ActuaryId").val() + "/documents/";
        var inputs = $("#proofOfTraining input[type='checkbox']");
        var courseAttended = []
        inputs.each(function (ind, val) {
            var course = {};
            course["IsDone"] = $(val).is(":checked");
            course["Title"] = $(val).attr("name");
            course["ActuaryId"] = $("#ActuaryId").val();
            courseAttended.push(course);
        });
        console.log(courseAttended)
        $.post(url, JSON.stringify({ courseAttended }), function (response) {
            console.log(response)
        })

发布数据

控制器

    [Route("api/actuary/{actuaryId:long}/documents/")]
    [HttpPost]
    public async Task<IHttpActionResult> uploadCourseTrainingProofAsync(List<CourseModel> courseAttended)
    {
        try
        {
            using (Data.ADPDB db = new Data.ADPDB())
            {
                foreach (CourseModel course in courseAttended)
                {
                    var tempDoc = new documents();
                    tempDoc.ActuaryId = course.ActuaryId;
                    tempDoc.Document = null;
                    tempDoc.DocumentTypeId = -1;
                    tempDoc.Done = course.IsDone;
                    tempDoc.Title = course.Title;

                    db.documents.Add(tempDoc);
                }
                await db.SaveChangesAsync();
            }
            return Ok();
        }
        catch (Exception ex) {
            return InternalServerError(ex.InnerException);
        }
    }

型号

    public class CourseModel
{
    public int ActuaryId { get; set; }

    public string Title { get; set; }

    public bool IsDone { get; set; }
}

【问题讨论】:

  • 我们可以看到你传递的对象数组吗?如果你使用的是 post 那么为什么不在 body 中传递 actuaryId 呢?
  • JSON.stringify({ courseAttended: courseAttended })
  • 尝试只发布 JSON.stringify(courseAttended);这看起来像您正在向控制器发送一个对象,而不是一个数组。
  • 尝试使用 JSON.stringify( courseAttended )
  • 感谢 RoryMcCrossan。 @TiisetsoTjabane 你也可以检查这个问题,它有一些很好的答案:stackoverflow.com/questions/13242414/…

标签: c# jquery asp.net-web-api model-view-controller http-post


【解决方案1】:

这就是最终对我有用的东西。

Javascript

        var inputs = $("#proofOfTraining input[type='checkbox']");

        var courseAttended = []
        inputs.each(function (ind, val) {
            var course = {};
            course["IsDone"] = $(val).is(":checked");
            course["Title"] = $(val).attr("name");
            course["ActuaryId"] = parseInt($("#ActuaryId").val());
            courseAttended.push(course);
        });

        $.ajax({
            url: "api/actuary/" + $("#ActuaryId").val() + "/documents/",
            cache: false,
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(courseAttended),
            dataType: "json",
            success: function (data) {
                console.log(data)
            }
        })

控制器:

    [Route("api/actuary/{actuaryId:long}/documents/")]
    [HttpPost]
    public async Task<IHttpActionResult> 
    uploadCourseTrainingProofAsync(List<CourseModel> courseAttended)
    {
     //.....
    }

我更感兴趣的是为什么我在 ajax 请求中指定了其余的细节。

感谢您的建议。

【讨论】:

  • 很可能原始代码未指定正确的内容类型 (JSON),因此模型绑定器无法将传入数据绑定到模型。
【解决方案2】:

您已为您的请求指定 Content-Type。对于您的案例 json。此外,您必须在模型类中将 ActuaryId int 的类型更改为字符串。下面是工作代码。

 $.ajax({
        type: "POST",
        contentType: 'application/json',
        url: "api/url",
        data: JSON.stringify(courseAttended),
        success:  (response)=> {
            console.log(response);
        },
        error: (response) =>{
            console.log(response);
        }
    });

public class CourseModel
{
    public string ActuaryId { get; set; }

    public string Title { get; set; }

    public bool IsDone { get; set; }
}

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多