WebAPI2模型绑定不适用于HTTP PUT

时间:2015-04-20 10:48:20

标签: ajax http asp.net-mvc-5 asp.net-web-api2

我正在关注关于PluralSight的Scott Allen的MVC4课程(我正在使用MVC5和WebAPI2,但他们应该是相同的)并且我试图通过HTTP PUT传递一个对象。模型绑定器应绑定它,但我为参数获取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
        });
    }

我的班级看起来像这样:

    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;
    }
}

关于为什么后端“客观”总是“空”的想法? 我已经完成了斯科特·艾伦正在做的事情,甚至尝试添加[FromBody]但没有运气。我明白,$ .ajax应该具有正确的内容类型,所以不需要设置它。

我有Fiddler2,但我不确定我所看到的是诚实的。我可以看到我的对象是JSON被发送到后端。

1 个答案:

答案 0 :(得分:0)

好吧,如果你熟悉模型绑定,你会在我的Objective类中看到这个问题:

public int ObjectiveID { get; private set; }

使用私有集,不能创建Objective类的实例。为了使其工作,需要删除“私有”访问说明符。

真正需要发生的是Objective变成了ObjectiveViewModel,我们将返回到Objective域对象的东西(它可能具有比我们需要的更多属性)。这可以有私人套装。