这是我第四个使用AngularJS和Web API 2 C#后端的生产级系统。虽然我有经验,但我无法使非常简单的转换工作正常。我通常在Angular UI和Web API 2后端之间使用复杂模型而没有问题,所以这让我非常沮丧。
我会在下面发布JSON:
请求体的输出是:
我会在下面发布JSON:
{
"appSelection": [
{
"name": "Withdrawal Service",
"selected": true
}
],
"dateSelection": {
"startDate": "2016-06-13T23:00:00.000Z",
"endDate": "2016-07-27T07:52:03.510Z"
},
"eventTypes": [
{
"name": "Fail",
"selected": true
},
{
"name": "Success",
"selected": true
}
]
}
针对Web API控制器:(为了简洁而编辑)
[HttpPost]
[Route("search")]
[ResponseType(typeof(ProcessLog[]))]
public async Task<IHttpActionResult> getLogs(LogRequest request)
{
string requestBody = string.Empty;
using (var stream = new MemoryStream())
{
var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
context.Request.InputStream.Seek(0, SeekOrigin.Begin);
context.Request.InputStream.CopyTo(stream);
requestBody = Encoding.UTF8.GetString(stream.ToArray());
}
这个模型被接受:
public class LogRequest
{
public DateViewModel DateSelection { get; set; }
public NameAndSelect[] appSelection { get; set; }
public NameAndSelect[] eventTypes { get; set; }
}
public class NameAndSelect
{
public bool selected { get; set; }
public string name { get; set; }
}
public class DateViewModel
{
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
}
请求体的输出是:
{"appSelection":[{"name":"Withdrawal Service","selected":true}],"dateSelection":{"startDate":"2016-06-13T23:00:00.000Z","endDate":"2016-07-27T07:52:03.510Z"},"eventTypes":[{"name":"Fail","selected":true},{"name":"Success","selected":true}]}
这说明JSON已正确地POST到Web API控制器,但自动模型绑定失败了。请求对象(Web API接收的模型)是
DateSelection : null
appselection : null
eventTypes : null
我真的不明白为什么和在哪里出了问题。已经尝试了两天以上!非常感谢再来一双鲜眼。
提前感谢你的帮助。
更新 #1:
将模型更改为以下内容,但自动绑定仍然失败。
public class LogRequest
{
public DateViewModel DateSelection { get; set; }
public List<NameAndSelect> appSelection { get; set; }
public List<NameAndSelect> eventTypes { get; set; }
}
更新 #2:
我已经尝试将模型简化为
public class LogRequestViewModel
{
public string testString { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public DateSelection dateselection { get; set; }
}
public class DateSelection
{
public string startDate { get; set; }
public string endDate { get; set; }
}
并发布:
{"teststring":"plap","startdate":"2016-07-27T09:28:38.404Z","enddate":"2016-07-27T09:28:38.404Z","dateselection"
:{"startdate":"2016-07-27T09:28:38.404Z","enddate":"2016-07-27T09:28:38.404Z"}}
我收到:
dateselection:null
enddate: {27/07/2016 10:28:38}
startdate: {27/07/2016 10:28:38}
teststring: "plap"
这表明它可以轻松转换日期时间,但更深层次的对象会导致问题
List<NameAndSelect>
。 - Shintu Joseph