使用FormData()向mvc控制器发送数组json对象

时间:2016-06-18 08:52:16

标签: angularjs asp.net-mvc

我正在尝试使用angular将文件上传到mvc控制器,一切正常,我得到文件,即使我在我的控制器中有DTO作为输入参数,它工作正常,所有成员都被mvc绑定,除了一个成员是列表类型。

这是我的DTO

 public class UpdateMeetingInput 
    {
        public Guid Id { get; set; }
        public string Subject { get; set; }
        public DateTime Date { get; set; }
        public DateTime EndTime { get; set; }
        public string Description { get; set; }
        public string Agenda { get; set; }
        public bool IsCancelled { get; set; }
        public List<AttendeeDto> Attendees {get;set;}
        public string Location { get; set; }
    }

这是我的javascript文件

     var fd = new FormData();
                for (var key in meeting) {
// i will add attendees later                    
if (key != "attendees") {
                        fd.append(key, meeting[key])
                    }

                }
 fd.append('attendees', JSON.stringify(meeting.attendees));

$http.post("/meeting/update", fd, {
                headers: { 'Content-Type': undefined }
            })

这是我的控制器

 public class MeetingController : TransitControllerBase
    {
        private readonly IMeetingManager _meetingManager;
        private readonly IRepository<Meeting, Guid> _meetingRepository;
        private readonly IRepository<Decision> _decisionRepository;
        private readonly UserManager _userManager;


        public MeetingController (IMeetingManager meetingManager, IRepository<Meeting, Guid> meetingRepository, IRepository<Decision> decisionRepository, UserManager userManager)
        {
            _meetingManager = meetingManager;
            _meetingRepository = meetingRepository;
            _decisionRepository = decisionRepository;
            _userManager = userManager;
        }
        [HttpPost]
        public  async Task Update (UpdateMeetingInput input)
        {

我使用rerquest.form.getvalue(&#34;与会者&#34;)观看与会者的价值,我得到以下正确的字符串,但我不知道为什么mvc无法绑定它做dto

"[{\"userId\":0,\"name\":null,\"role\":\"4\",\"email\":\"someone@microsoft.com\",\"isGuest\":false,\"$$hashKey\":\"object:311\"}]"

我在发布数据时做错了吗?

1 个答案:

答案 0 :(得分:0)

那是因为您使用表单数据,其中不是 json,但JSON.stringify将您的列表格式化为json,这不是模型绑定器所期望的。

要解决此问题,您可以使与会者成为模型中的字符串,然后在JSON控制器中显式地对其进行反序列化。

或者,您可以尝试使用特殊语法attendees[]作为字段名称(注意方括号),而不是JSON.stringify。像这样:

for (var i = 0; i < attendees.length; i++) {
    fd.append('attendees['+i+'][userId]', attendees[i].userId);
    fd.append('attendees['+i+'][name]', attendees[i].name);
    ....
}