0

我遇到了一个奇怪的绑定问题,试图通过 JSON 有效负载在 ajax 发布请求中将列表数据发送到 MVC4 控制器。

我们发送的有效载荷是

{
   "assignmentId":"AssignmentId2",
   "shiftId":null,
   "startDate":null,
   "startTime":{
      "hours":0,
      "minutes":0
   },
   "endTime":{
      "hours":0,
      "minutes":0
   },
   "breaksDuration":{
      "hours":0,
      "minutes":0
   },
   "authorised":false,
   "authorisedName":null,
   "mileageDescription":null,
   "mileage":0,
   "expenses":[
      {
         "description":"DADADDAADADADAD",
         "total":"5"
      }
   ],
   "billableDuration":{
      "hours":0,
      "minutes":0
   },
   "expensesComplete":true,
   "expensesTotal":5
}

费用清单项目未绑定到以下模型结构

public class ShiftApiModel
    {
        public string assignmentId { get; set; }
        public string shiftId { get; set; }
        [Required]
        public DateTime startDate { get; set; }
        [Required]
        public ShortTimeSpan startTime { get; set; }
        [Required]
        public ShortTimeSpan endTime { get; set; }
        public bool authorised { get; set; }
        public string authorisedName { get; set; }
        public ShortTimeSpan breaksDuration { get; set; }
        public decimal mileage { get; set; }
        public string mileageDescription { get; set; }

        private IList<ExpenseApiModel> _expenses = new List<ExpenseApiModel>();
        public IList<ExpenseApiModel> expenses { get { return _expenses; } set { _expenses = value; } }
    }

public class ExpenseApiModel
{
    public string description { get; set; }
    public double total { get; set; }
}

实际的ajax请求如下:

 $.ajax({
    type: type,
    url: serviceUrl,
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    data: (props.data) ? props.data : null,
    success: function (jqXHR, textStatus) {
    this.serviceCallComplete(jqXHR, props.complete, props.error);
    }.bind(this),
    error: function (jqXHR, textStatus, errorThrown) {
    this.serviceCallFailure(jqXHR, props.error);
    }.bind(this)
});

其中 props.data 是上述 JSON 有效负载。

我一直对此摸不着头脑,看不出任何明显的理由说明为什么费用项目不会受到约束。

有什么想法/建议吗?

4

2 回答 2

1

您不能绑定到接口。使用 List 与 IList:

private List<ExpenseApiModel> _expenses = new List<ExpenseApiModel>();
public List<ExpenseApiModel> expenses { get { return _expenses; } set { _expenses = value; } }
于 2013-01-11T17:07:29.153 回答
0

在 MVC4 模型绑定方面,我遇到了与您非常相似的问题。我有一个解决方案,但无法访问模型绑定器源,我只能推测答案。您的问题的解决方案可能是将“expensesComplete”和“expensesTotal”的名称更改为不以“expenses”开头的其他名称。

我的模型(是的,你可以绑定到一个接口,用列表或数组替换 IEnumerable 没有区别,我看到模型绑定器实际上只是在这里粘贴了一个列表)& 动作被剥离到他们最简单的形式:

[Serializable]
public class InvolvedPartyDetails
{
    public long? Key { get; set; }
}

[Serializable]
public class IncidentDetails
{
    public long IncidentNo { get; set; }
    public string InvDisp { get; set; }
    public string ChangeDetails { get; set; }
    public IEnumerable<InvolvedPartyDetails> Inv { get; set; }
}

[HttpPost]
public ActionResult SubmitData(IncidentDetails incident)
{
...

如果我提交以下 JSON(包含信息的标题,从这里开始将是相同的)。为了清楚起见,JSON 也放在多行:

POST http://johnapi.com/AngularTest/SubmitData HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://johnapi.com/AngularTest/MVCCrazy/
Accept-Language: en-GB,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MDDCJS; rv:11.0) like Gecko
Host: johnapi.com
Content-Length: 72
DNT: 1
Connection: Keep-Alive
Pragma: no-cache

{"IncidentNo":0,
"InvDisp":"Boo",
"ChangeDetails":"COD",
"Inv":[{"Key":0}]}

event.Inv 将为空。

虽然有许多令人困惑的副作用,但我发现在 IncidentDetails 模型中重命名 InvDisp 属性以免以 Inv 开头解决了问题。

以下 JSON 在模型中将 InvDisp 重命名为 InxDisp 会生成一个包含 1 个 event.Inv 元素的列表:

{"IncidentNo":0,
"InxDisp":"Boo",
"ChangeDetails":"COD",
"Inv":[{"Key":0}]}

一个令人困惑的副作用的例子是,我可以从 IncidentDetails 类中删除 ChangeDetails 属性,并向 InvolvedPartyDetails 类添加几个属性,它会突然开始工作,例如,以下 JSON 会给我一个带有单个项目的 event.Inv:

{"IncidentNo":0,
"InvDisp":"Boo",
"Inv":[{"LinkType":null,"Key":0,"Name":null}]} 

但是删除 InvolvedPartyDetails 中的任一属性或放回 ChangeDetails 将再次阻止绑定,同样,有时在数组中发送多个 InvolvedPartyDetails 会导致事情正常工作,具体取决于存在的其他属性。

但是,唯一可靠的解决方案是命名。

于 2013-12-17T15:41:48.513 回答