Привязка пользовательской модели .NET MVC 2.0 не вызывается при использовании SWFUpload - PullRequest
0 голосов
/ 29 июня 2010

Я загружаю файлы, используя SWFUpload. Чтобы получить необходимые данные вместе с файлом, я добавляю пост-параметры в swfupload. Проблема в том, что созданный мной механизм связывания пользовательских моделей не вызывается, когда метод контроллера вызывается swfupload. Некоторые свойства моей модели установлены, но не свойства, контролируемые моим пользовательским связывателем, что означает, что он использует связыватель модели по умолчанию.

Когда я использую следующий метод JQuery, все работает как задумано. Таким образом, проблема не в том, что мой пользовательский механизм связывания настроен неправильно.

$.post('AsyncUpload', $('#uploadform').serialize());

Ниже приведен код, который я использую для настройки параметров сообщения и запуска процесса загрузки. Обратите внимание, что я знаю о функции setPostParams, но по какой-то причине она не работает для меня, следовательно, обходной путь. Также обратите внимание, что я проверил, что параметры сообщения корректно устанавливаются в переменной Request на стороне сервера.

$('#uploadbutton').click(function (e) {
    e.preventDefault();
    var data = $('#uploadform').serialize();
    var res = $.parseQuery(data);

    for (key in res) {
            swfu.addPostParam(key, res[key]);
    }

    swfu.startUpload();
});

Соответствующие переменные swfupload устанавливаются следующим образом.

upload_url: '<%= Url.Action("AsyncUpload")%>',  //This becomes /Home/AsyncUpload
use_query_string: true,  // I have also tried setting this to false to no effect

Это мой метод управления, такой, какой он есть.

[HttpPost]
public bool AsyncUpload(EditModel model)
{
    if (Request.Files.Count <= 0)
        return false;

    return true;
}

Есть идеи, почему не вызывается связующее для пользовательской модели?

1 Ответ

0 голосов
/ 01 июля 2010

Оказывается, причиной проблемы была кодировка символов.Мой пользовательский механизм связывания создан для обработки свойств словаря.

Моя модель выглядит примерно так:

public class EditModel
{
    public string Name { get; set; }
    public Dictionary<int, string> Type { get; set; }
}

Как указано в моем вопросе, метод контроллера выглядит следующим образом:

[HttpPost]
public bool AsyncUpload(EditModel model)
{
    if (Request.Files.Count <= 0)
        return false;

    return true;
}

На стороне клиентаУ меня есть текстовые поля управления и флажки.Текстовые поля отображаются на свойства строки.Флажки будут сопоставлены со свойствами словаря и будут иметь такие имена, как «Тип [0]», «Тип [7]» и т. Д., Которые я анализирую с помощью своего пользовательского связывателя модели, чтобы извлечь ключ из скобок.

Теперь все работает, как и ожидалось, при вызове функции jQuery

$.get('AsyncUpload', $('#uploadform').serialize());

Поскольку строка запроса, отправляемая в контроллер,

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%5B0%5D

Тип% 5B0% 5D декодируется в Тип[0].MVC признает это как словарь, и мы готовы к гонкам.

Передача уже закодированной строки в функцию addFostParam SWFUpload была проблемой.Он принимал значение, которое я устанавливал, которое было «Тип% 5B0% 5D» и кодировало «%» в% 25.Таким образом, строка запроса из SWFUpload была:

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%255B0%255D

Тип затем был декодирован как Тип% 5B0% 5D, который MVC не распознал как словарь.Имя будет установлено правильно, потому что связыватель модели по умолчанию знает, как обращаться с простым строковым свойством.

Чтобы устранить эту проблему, я внес следующие изменения в свой JavaScript.Он заменит кодировку скобок фактическими скобками.Затем они будут закодированы обратно при вызове на сервер, и все будет хорошо со вселенной.

for (key in res) {
    var value = res[key];
    var fixedKey = key;
    fixedKey = fixedKey.replace('%5B', '[');
    fixedKey = fixedKey.replace('%5D', ']');
    swfu.addPostParam(fixedKey, value);
}

Большое спасибо Мэтью Эбботу, который прокомментировал мой пост, что заставило меня еще раз взглянуть наимена передаются на сервер.Вы спасли мое здравомыслие.

...