我一直得到一个奇怪的绑定问题,试图通过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会导致事情正常工作,这取决于其他属性。
然而,唯一健壮的解决方案是命名。