这似乎是一个相当普遍的主题,很少有人给出了一些非常有建设性的答案,但我仍然在努力让我的工作尝试。
例如,问题与this one大致相同,只是我只是尝试发送单个复杂对象而不是数组。
我的控制器看起来像这样:
[AcceptVerbs (HttpVerbs.Put)]
[Authorize]
[JsonFilter(Param="Designer", JsonDataType=typeof(Designer))]
public JsonResult SaveProfile(Designer Profile)
{
ProfileRepository Repo = new ProfileRepository();
Designer d = Repo.GetById(Profile.ID);
d.Comments = Profile.Comments;
d.DisplayName = Profile.DisplayName;
d.Email = Profile.Email;
d.FirstName = Profile.FirstName;
d.LastName = Profile.LastName;
Repo.Update(d);
return Json(Profile);
}
检索页面数据并发布它的代码如下所示:
$('#save-profile').click(function () {
var Profile = {};
var context = $('#profile-data')[0];
$('span', context).each(function () {
Profile[this.id] = $(this).text();
});
Profile.ID = $('h3', context).attr('id');
console.log(Profile);
//var DTO = { 'Profile': Profile };
$.ajax({
type: "PUT",
url: "/Home/SaveProfile",
data: { 'Profile': Profile },
success: function (data) {
console.log(data);
}
});
});
正确创建对象并将其发布到服务器(顺便说一下,我尝试使用POST和PUT),服务器似乎正在接收一个对象实例,但属性 - 像往常一样 - 都是null。
我错过了什么?我尝试使用上面链接的示例问题中的方法(改编),但似乎仍然没有更接近解决方案。任何帮助表示赞赏。
答案 0 :(得分:1)
事实证明,ActionResult方法本身没有任何问题,JavaScript对象或Ajax帖子也没有任何问题。问题实际上在于装饰ActionResult的自定义过滤器以及为其param值设置的参数。
以下属性为我正在尝试传入的参数名称设置了“Designer”参数。我已将其作为参数名称和类型提供。
[JsonFilter(Param="Designer", JsonDataType=typeof(Designer))]
正确的版本应为:
[JsonFilter(Param="Profile", JsonDataType=typeof(Designer))]