Связывание настраиваемой модели .NET MVC 2.0 не вызывается при использовании SWFUpload

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

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

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

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

$('#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;
}

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


person Jaaromy Zierse    schedule 29.06.2010    source источник
comment
Единственное, о чем я могу думать, это то, что у вас есть несоответствия имен форм (имена ключей в данных сообщения), которые не соответствуют свойствам вашего типа EditModel. Вы проверили, что все имена форм / ключи данных публикации совпадают со свойствами вашей модели?   -  person Matthew Abbott    schedule 30.06.2010
comment
Я убедился, что они были правильными, и я думал, что это так, но я слегка ошибался. Я отвечу тем, что нашел, но СПАСИБО за то, что подтолкнул меня в правильном направлении. Я уже некоторое время борюсь с этим.   -  person Jaaromy Zierse    schedule 01.07.2010


Ответы (1)


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

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

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 распознает это как словарь, и мы готовы к скачкам.

Проблема заключалась в передаче уже закодированной строки в функцию addPostParam 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);
}

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

person Jaaromy Zierse    schedule 01.07.2010