Загрузка кендо не публикует объект со свойством сложного типа

Я использую управление загрузкой кендо в приложении Asp.net MVC. При нажатии кнопки OK я хочу загрузить файл вместе с некоторыми метаданными (обратите внимание, что эта кнопка OK не является кнопкой OK элемента управления Загрузить, это какая-то другая кнопка в пользовательском интерфейсе)

Поэтому я установил для AutoUpload значение false.

Затем я запускаю событие загрузки через javascript. Я также хочу сохранить метаданные вместе с файлом, как указано в документации здесь я прикрепил событие на стороне клиента Upload для установки метаданных.

Вот мой полный код

CSHTML

      @(Html.Kendo().Upload().Name("files")
                 .Async(a=>a.Save("Save", "Home")
                 .AutoUpload(false)))

Загрузить JavaScript

$(function () {
    var _btnOK = $("#btnOK");
    var kendoUpload = $("#files").getKendoUpload();

    // trigger kendo's upload event
    _btnOK.click(function (e) {    
        e.preventDefault();    
        $(".k-upload-selected").click();    
    }); 

     // attach metadata here
     kendoUpload.bind("upload", function (e) {
             e.data = {
                    "Name": "John Doe",
                    "Age": 40,
                    "Address": {
                        "State": "TX",
                        "City": "Dallas"
                    }
                };
        })       

 })

Соответствующий контроллер MVC и модель C#

 public class Person
 {
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }

 }

   public class Address
   {       
     public string State { get; set; }
     public string City { get; set; }
   }

    [HttpPost]
    public async Task<ActionResult> UploadDocument(Person model)
    {
        //file get posted in HttpContext.Request.Files

        //model's immediate properties like Name and Age get posted however
        //model.Address is remains null
    }

Когда я нажимаю «ОК», выбранный файл отправляется на сервер внутри HttpContext.Request.Files, как и ожидалось.
Также публикуются непосредственные свойства модели, которые имеют примитивный тип данных, однако дочернее свойство модели типа сложного объекта не получает сообщение.

Таким образом, в приведенном выше примере Name и Age имеют значение, но Address остается нулевым.

Есть идеи?


person LP13    schedule 03.08.2017    source источник


Ответы (1)


Проблема в том, что виджет Kendo Upload в конечном итоге добавляет поля к объекту FormData, который может обрабатывать только строки или большие двоичные объекты в качестве значений (https://developer.mozilla.org/en-US/docs/Web/API/FormData/append).

Что вы можете сделать, так это сериализовать ваш адресный объект в строку json на стороне клиента, а затем десериализовать его в адресный объект в вашем контроллере.

Код клиента:

// attach metadata here
     kendoUpload.bind("upload", function (e) {

             var address = {
                 "State": "TX",
                 "City": "Dallas"
             };

             e.data = {
                    "Name": "John Doe",
                    "Age": 40,
                    "Address": JSON.stringify(address)
                };
        })

Код контроллера:

[HttpPost]
    public async Task<ActionResult> UploadDocument(Person model)
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        model.Address = js.Deserialize<Address>(HttpContext.Request.Form["Address"]);

        // Do other stuff with your model

    }
person Orilux    schedule 04.08.2017
comment
@Orilus, поэтому, если ключ равен Address.State и Address.City, он должен быть отправлен на сервер, и .NET должен иметь возможность десериализовать его в объект C # - person LP13; 04.08.2017
comment
так что я думаю, что это ошибка в кендо тогда - person LP13; 04.08.2017