我正在关注关于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被发送到后端。
答案 0 :(得分:0)
好吧,如果你熟悉模型绑定,你会在我的Objective类中看到这个问题:
public int ObjectiveID { get; private set; }
使用私有集,不能创建Objective类的实例。为了使其工作,需要删除“私有”访问说明符。
真正需要发生的是Objective变成了ObjectiveViewModel,我们将返回到Objective域对象的东西(它可能具有比我们需要的更多属性)。这可以有私人套装。