【问题标题】:Model isn't binding when I send JSON to MVC controller当我将 JSON 发送到 MVC 控制器时,模型没有绑定
【发布时间】:2020-04-22 12:36:05
【问题描述】:

我可能忽略了一些东西,但我的 JSON 有效负载根本没有为我的控制器绑定。我尝试过开设一个有List<Models.UpdateChatRequestModel> Chats 的课程,但这对我也不起作用。我尝试过使用数组名称,但这似乎也不起作用。

控制器:

[HttpPost]
public IActionResult UpdateChatRequest(IList<Models.UpdateChatRequestModel> request)
{
    var model = new Models.ChatModel();

    return Json(model);
}

型号:

public class UpdateChatRequestModel
{
    public int UserID
    {
        get; set;
    }

    public int LastID
    {
        get; set;
    }
}

JavaScript:

class Chat {
    constructor(UserID, LastID) {
        this.UserID = UserID;
        this.LastID = LastID;
    }
}
var chats = [new Chat(0, 1), new Chat(1, 4)];

function RequestChatUpdate() {
    $.ajax({
        type: "POST",
        url: '/Chat/UpdateChatRequest',
        data: JSON.stringify(chats),
        contentType: "application/json",
        success: function (data) {
            alert("got response from chat update");
        }
    });
}

RequestChatUpdate()发送的JSON:

[{"UserID":0,"LastID":1},{"UserID":1,"LastID":4}]

【问题讨论】:

    标签: javascript c# json asp.net-mvc .net-core


    【解决方案1】:

    我找到了答案。

    您必须在模型参数前面有[FromBody],如下所示:

    [HttpPost]
    public IActionResult UpdateChatRequest([FromBody] IList<Models.UpdateChatRequestModel> request)
    {
        var d = ModelState;
        var model = new Models.ChatModel();
    
        return Json(model);
    }
    

    【讨论】:

    • 你需要添加一些我建议你的东西吗?
    • 不,显然新的框架更新出于某种奇怪的原因需要 [FromBody] 属性。
    【解决方案2】:

    您需要为您的 JSON 添加名称,如下所示

    var request = JSON.stringify({ 'request': chats });
    

    那么你的ajax请求就会变成

    function RequestChatUpdate() {
        $.ajax({
            type: "POST",
            url: '/Chat/UpdateChatRequest',
            data: request,
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function (data) {
                alert("got response from chat update");
            }
        });
    }
    

    更新

    根据this规范,它说

    为了在 ASP.NET Core 中正确绑定 JSON,您必须修改 您在参数上包含属性 [FromBody] 的操作。这 告诉框架使用请求的内容类型标头 决定将哪个已配置的 IInputFormatters 用于模型 绑定

    这就是你需要添加[FromBody]的原因

    【讨论】:

    • 你有没有尝试改变参数的类型——控制器?从IList&lt;Models.UpdateChatRequestModel&gt; request)Models.UpdateChatRequestModel [] request
    • 请尝试发送var request = JSON.stringify({ 'request': [{"UserID":0,"LastID":1},{"UserID":1,"LastID":4}]})
    • 还是没有结果
    • 请加dataType: 'json',
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2016-09-07
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多