Как я могу подключить плагин jQuery для загрузки с ASP.NET MVC?

Я пытаюсь получить плагин jQuery, Uploadify , для работы с ASP.NET MVC.

У меня есть плагин, показывающий тонкий со следующим фрагментом кода JavaScript:

<script type="text/javascript">
    $(document).ready(function() {
        $('#fileUpload').fileUpload({
            'uploader': '/Content/Flash/uploader.swf',
            'script': '/Placement/Upload',
            'folder': '/uploads',
            'multi': 'true',
            'buttonText': 'Browse',
            'displayData': 'speed',
            'simUploadLimit': 2,
            'cancelImg': '/Content/Images/cancel.png'
        });
    });
</script>

Кажется, что все хорошо. Если вы заметили, атрибут «script» установлен на my / Placement / Upload, который является моим контроллером мест размещения и моим действием по загрузке.

Основная проблема заключается в том, что мне трудно получить это действие для получения файла. Я установил точку останова для этого действия, и когда я выбираю файл для загрузки, он не выполняется.

Я попытался изменить подпись метода на основе этой статьи :

public string Upload(HttpPostedFileBase FileData)
{
    /*
    *
    * Do something with the FileData
    *
    */
    return "Upload OK!";
}

Но это все еще не срабатывает.

Может ли кто-нибудь помочь мне написать и правильно подписать подпись действия диспетчера загрузки, чтобы она действительно срабатывала? Затем я могу обработать данные файла. Мне просто нужна помощь, чтобы запустить метод.

jquery,asp.net-mvc,uploadify,

34

Ответов: 6


20 принят
public string Upload(HttpPostedFileBase FileData) {}

правильно - файл, загруженный uploadify, будет привязан к FileData. Не нужно заходить в Request.Files для извлечения файла, что затрудняет издевательство и тестирование.

Если ваше действие вообще не срабатывает (например, попробуйте отладки и посмотрите, удалась ли точка останова в методе), ваша проблема, скорее всего, будет иметь значение «script» - вы работаете под виртуальным каталогом? Если это так, вам нужно поставить имя каталога впереди. Uploadify использует абсолютный путь.

т.е. 'script:' / virtual_directory / Placement / Upload '

прямо сейчас uploadify отправляет на http: // localhost / Placement / Upload .

также попробуйте использовать отладчик маршрутов ( http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx ), чтобы проверить, к чему привязан ваш маршрут.


10

Проблема может заключаться в том, что вам нужно указать, что действие, которое вы загружаете, установлено в Post ... оно не будет работать с действием как действие Get.

Итак, это:

public string Upload(HttpPostedFileBase FileData)
{
   //do something
}

Должно быть:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload(HttpPostedFileBase FileData)
{
   //do something
}

Кроме того, имейте в виду, что если вы используете это в разделе «вошел в систему» ??на своем сайте, вы должны посмотреть здесь на известную ошибку с добавлением и аутентификацией: http://geekswithblogs.net/apopovsky/archive/2009/ 05/06 / рабочей вокруг вспышки-печенье-ошибка-в-asp.net-mvc.aspx

Кроме того, в стороне есть несколько способов управления загрузкой файлов (используя Request.Files в соответствии с предложением Рори Фитцпатрика, а также передачу файла HttpPostedFileBase в качестве аргумента в определении действия). Это не должно иметь большого значения, чтобы заставить Uploadify работать.


2

Это не то, как мне пришлось выполнять загрузку файлов вообще. У меня был метод действия без параметров, которые использовали текущий объект Request для погружения в коллекцию опубликованных файлов.

Некоторые примеры кода из моей реализации:

[AcceptVerbs(HttpVerbs.Post)]
public ContentResult Upload() {
    if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) {
        HttpPostedFileBase postedFile = Request.Files[0];
        // Do something with it
    }
}

Конечно, писать тесты для этого становится PITA. Вы должны издеваться над несколькими объектами, чтобы заставить его работать, например:

var mockHttpContext = mocks.StrictMock<HttpContextBase>();
var mockRequest = mocks.StrictMock<HttpRequestBase>();
var postedFile = mocks.StrictMock<HttpPostedFileBase>();

var postedFileKeyCollection = mocks.StrictMock<HttpFileCollectionBase>();

mockHttpContext.Expect(x => x.Request).Return(mockRequest).Repeat.Any();
mockRequest.Expect(x => x.Files).Return(postedFileKeyCollection).Repeat.Any();

postedFileKeyCollection.Expect(x => x[0]).Return(postedFile).Repeat.Any();
postedFileKeyCollection.Expect(x => x.Count).Return(1);

postedFile.Expect(f => f.ContentLength).Return(1024);
postedFile.Expect(f => f.InputStream).Return(null);

Было бы проще создать интерфейс в размещенных файлах и только издеваться над этим, с конкретной реализацией, внедренной в ваш контроллер с помощью IoC.

Я думаю, что это в значительной степени основывалось на этом сообщении: Реализация загрузки файла HTTP с помощью ASP.NET MVC, включая тесты и Mocks


2

Мое полное решение этой проблемы может решить вашу проблему. Надеюсь, поможет.

http://zootfroot.blogspot.com/2010/12/mvc-file-upload-using-uploadify-with.html


0

Читая документацию, похоже, что она отправляет массив файлов. Ты пробовал:

public string Upload( HttpPostedFileBase[] fileData )

Также возможно, что связующее устройство по умолчанию не будет работать с HttpPostedFileBase, и вам придется либо использовать механизм Рори, либо написать собственное связующее устройство.

JQuery, asp.net-MVC, Uploadify,
Похожие вопросы