【问题标题】:Complex object not getting bound to JSON data复杂对象未绑定到 JSON 数据
【发布时间】:2016-07-06 04:03:09
【问题描述】:

我有两个 ViewModel 对象 TalentViewModelEditTalentViewModel。以下是它们各自的代码:

TalentViewModel

public class TalentViewModel
{
    [JsonProperty(PropertyName = "TalentId")]
    public long TalentId { get; set; }
    [JsonProperty(PropertyName = "TalentName")]
    public string TalentName { get; set; }
}

编辑TalentViewModel

public class EditTalentViewModel
{
    [JsonProperty(PropertyName = "AddedTalents")]
    public List<TalentViewModel> AddedTalents { get; set; } 
    [JsonProperty(PropertyName = "RemovedTalents")]
    public List<TalentViewModel> RemovedTalents { get; set; } 
}

我使用 ajax 调用将 json 数据发送到操作方法,该方法接受 EditTalentViewModel 作为参数。这是发送ajax请求的angularJs代码

//this will send the json data to InterestController
$scope.saveInterest = function (talents) {
    $http({
        method:"POST",
        url:"/Interest/AddTalents",
        data: {talents},
        headers: {
            'Content-type': "application/json"
        },
        responseType:"json"
    }).success( function(data){
        console.log(data);

    }).error( function(data){
        console.log("Error happening");
    });
}

我使用了this answer 中建议的自定义模型绑定器,并将其用作 EditTalentViewModel 对象的模型绑定器。下面是action方法的一部分:

[HttpPost]
public ActionResult AddTalents([ModelBinder(typeof(JsonModelBinder))]EditTalentViewModel talents)
{
    if (!ModelState.IsValid) return Json("Fail");
    var userId = User.Identity.GetUserId<long>();
    if (talents.AddedTalents == null && talents.RemovedTalents == null)
    {
        return Json("Success");
    }
    //.........
}

发送到的 JSON 数据示例如下所示:

{
    "AddedTalents": [{
        "TalentId": 10,
        "TalentName": "Sculptor"
    }, {
        "TalentId": 8,
        "TalentName": "Painter"
    }],
    "RemovedTalents": [{
        "TalentId": 2,
        "TalentName": "Dj"
    }]
}

但是,当我调试代码时,EditViewModel 类的 AddedTalentsRemovedTalents 属性为空。我在这里想念什么?我怎么解决这个问题?还有更好的模型绑定方法吗?

【问题讨论】:

  • 如果talents是集合,那么不要用{}包裹talents,直接传递数据data: talents
  • 请注意,您使用的是 legacy 承诺语法 successerror,请改用 then 方法,如此处所述 (docs.angularjs.org/api/ng/service/$http)跨度>
  • @PankajParkar,你说得对!这就是问题所在。添加您的评论作为答案,以便我接受。

标签: c# angularjs json asp.net-mvc angularjs-http


【解决方案1】:

talents 是您想要作为请求正文发布到服务器的对象的集合。所以错误是您将talents{} 包装在一起,这不是必需的,因为talents 已经是对象的集合。

$http({
    method:"POST",
    url:"/Interest/AddTalents",
    data: talents, //<--change here, removed unwanted {}
    headers: {
       'Content-type': "application/json"
    },
    responseType:"json"
})

【讨论】:

  • 如果人才是一个简单的对象呢?我们还需要去掉花括号吗?发送ajax数据时什么时候使用花括号比较合适?
  • @avidProgrammer 看到,您必须以预期的格式将数据从客户端发送到服务器。就像这里的服务器接受 talent 的集合,因为您已经在客户端拥有 talents这是工作。现在我来回答你的问题.. 是的.. 你应该把它做成一个数组,然后把它传递给服务器,就像[].concat(talent) 这样可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多