WebAPI2 模型绑定不适用于 HTTP PUT

WebAPI2 Model Binding not working with HTTP PUT

我正在学习 Scott Allen 在 PluralSight 上的 MVC4 课程(我使用的是 MVC5 和 WebAPI2,但它们 应该 相同)并且我正在尝试通过 HTTP 传递对象放。模型绑定器应该绑定它,但我得到的参数为 NULL。

    public HttpResponseMessage PutObjective(int id, [FromBody] Objective objective)
    {
        if (ModelState.IsValid && id == objective.ObjectiveID)
        {
            //todo: update - look up id, replace text
            return Request.CreateResponse(HttpStatusCode.OK, objective);
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }  
    }

在我的前端javascript我正在做以下事情(我正在创建一个测试对象,所以忽略传入的'objective'):

        var updateObjective = function (objective) {

        var myobj = { "ObjectiveID": "3", "ObjectiveDescription": "test" };

        return $.ajax(objectiveApiUrl + "/" + objective.ObjectiveID, {
            type: "PUT",
            data: myobj
        });
    }

我的 class 看起来像这样:

    public class Objective
{
    public int ObjectiveID { get; private set; }
    public string ObjectiveDescription { get; set; }
    public Objective (int Id, string Desc)
    {
        this.ObjectiveID = Id;
        this.ObjectiveDescription = Desc;
    }
}

想知道为什么后端的 'objective' 总是 'null' 吗? 我已经完成了 Scott Allen 正在做的事情,甚至尝试添加 [FromBody] 但没有成功。 $.ajax 我理解默认应该有正确的内容类型,所以不需要设置它。

我有 Fiddler2,但老实说,我不确定我在看什么。我可以看到我的对象 JSON 被发送到后端。

好吧,如果您熟悉模型绑定,您就会在我的 Objective class:

中看到这个问题
public int ObjectiveID { get; private set; }

对于私有集,无法创建 Objective class 的实例。要使其正常工作,需要删除 'private' 访问说明符。

真正需要发生的是 Objective 变为 ObjectiveViewModel,我们将返回的内容转换为 Objective 域对象(它可能具有比我们需要的更多的属性这个画面)。这可以有一个私人集。