ASP.NET Core 1中的Ajax数据发布不会传递值

时间:2016-07-27 16:30:31

标签: jquery ajax asp.net-web-api asp.net-core asp.net-ajax

如何在从数据字段传递数据时使用Ajax发布数据?问题似乎是我的数据没有正确发布到控制器,因为我试图用硬编码的数字替换实际的数据属性,但仍然无法发布该号码。这是我的ajax电话:

                $(".js-toggle-attendance")
                .click(function(e) {
                    var button = $(e.target);
                    $.ajax({
                            url: "/api/attendances/",
                            method: "POST",
                            contentType: "application/json",
                            data: 'gigId : button.attr("data-gig-id")',
                            dataType: "json"
                        })
                        .done(function() {
                            button
                                .removeClass("btn-default")
                                .addClass("btn-info")
                                .text("Going");
                        })
                        .fail(function() {
                            alert("Something failed!");
                        });
                });
        });
</script>

我的控制器操作如下:

        [HttpPost]
    public IActionResult Attend(AttendanceDTO dto)
    {

和AttendanceDTO只是一个简单的数据传输对象类:

    public class AttendanceDTO
{
    public int GigId { get; set; }
}

我为数据方法尝试了以下变体,Chrome开发工具/网络请求有效负载中的内容如下(我点击id为1的按钮):

    data: 'gigId : button.attr("data-gig-id")'--> gigId : button.attr("data-gig-id")
    data: { "gigId": button.attr("data-gig-id") } --> gigId=1
    data: button.attr("data-gig-id") --> 1      No Properties
    data: "2" --> 2    No Properties

在所有情况下,调试控制器操作会将dto字段显示为0。

更新 我添加了[FromBody]标签和JSON字符串化数据,现在似乎正在发布正确的数据。但是,上面的fail方法一直在执行。我更新了代码以提取错误消息,如下所示:

                $(".js-toggle-attendance")
                .click(function(e) {
                    var button = $(e.target);
                    $.ajax({
                        url: "/api/attendances/",
                        method: "POST",
                        contentType: "application/json",
                        data: JSON.stringify({ "gigId": button.attr("data-gig-id") }),
                        dataType: "json",
                        success: function() {
                            button
                                .removeClass("btn-default")
                                .addClass("btn-info")
                                .text("Going");
                        },
                        error: function(error) {
                            var x = error;
                            alert("Something failed!");
                        }
                    });
                });

我能够从Chrome开发工具中捕获的错误消息:

error = Object {readyState: 4, responseText: "", status: 200, statusText: "OK"

更新上述问题: 只需删除dataType:&#34; json&#34;因为服务器没有推回json。

3 个答案:

答案 0 :(得分:2)

您没有将动作参数声明为[FromBody]

[HttpPost]
public IActionResult Attend([FromBody]AttendanceDTO dto)
{
}

应该做的伎俩。至于数据,{ "gigId": button.attr("data-gig-id") }应该是正确的格式,尽管您可能需要在传递之前将其转换为json字符串。

答案 1 :(得分:1)

我通过添加GigId:button.attr(&#34; data-gig-id&#34;)来解决同样的问题。能够解决它 这可能会有所帮助

$(document).ready(function() { 
        $(".js-toggle-attendance").click(function (e) {
            var button = $(e.target);

            $.post("/api/attendances", { GigId: button.attr("data-gig-id") })
                .done(function() {
                    button
                        .removeClass("btn-default")
                        .addClass("btn-info")
                        .text("Going");
                })
                .fail(function() {
                    alert("something failed !");`enter code here`
                });
        });
    });

答案 2 :(得分:0)

如果它帮助了其他人,我有一个没有无参数构造函数的DTO和前一个用于抛出异常的ASP.NET Core,而ASP.NET Core没有,它只是给你一个空对象