MVC4问题绑定列表通过AJAX发送到控制器模型



我一直得到一个奇怪的绑定问题,试图通过JSON有效负载将列表数据发送到ajax post请求中的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)
});

道具。data是上面描述的JSON有效负载。

我一直在挠头,找不到任何明显的理由来解释为什么费用项不被绑定。

有什么建议吗?

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

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

我有一个非常类似的问题与你的MVC4模型绑定。我有一个解决方案,但没有访问模型粘合剂源,我只能推测答案。也许你的问题的解决方案是将"expensesComplete"one_answers"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}]}

事件。Inv将为空

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

下面的JSON,在模型中将InvDisp重命名为InxDisp,生成了一个包含1个事件元素的列表。发票:

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

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

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

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

然而,唯一健壮的解决方案是命名。

相关内容

  • 没有找到相关文章

最新更新