2016-06-18 4 views
-1

Я пытаюсь загрузить файл в контроллер mvc с помощью углового, все работает отлично, я получаю файл, даже у меня есть DTO в качестве входного параметра в контроллере, он отлично работает, все члены привязаны mvc, за исключением члена, который является типом List.отправка массива json-объекта с помощью FormData() в 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 ("attendees"), и я получаю следующую строку, которая является правильной, но я не знаю, почему mvc не может связать это делать dto

"[{\"userId\":0,\"name\":null,\"role\":\"4\",\"email\":\"[email protected]\",\"isGuest\":false,\"$$hashKey\":\"object:311\"}]" 

Я делаю что-то неправильно в публикации данных?

ответ

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); 
    .... 
} 
+0

i де-сериализуйте его явно в контроллере от JSON. – Arash