Расширение существующего плагина JQuery // переменная область видимости - PullRequest
1 голос
/ 28 февраля 2012

Прежде всего, я не FED (я концентрируюсь на архитектуре и внутреннем коде), поэтому мой JQuery не так хорош, как мог бы.Если у вас есть какие-либо предложения по улучшению моего кода, это будет приветствоваться.

Я использую плагин uploadify jQuery для загрузки изображений на мой веб-сайт.Я создал сайт, используя ASP.Net MVC3, и я использую сложные типы для форм (с шаблонами редактора).По сути, моя структура позволяет мне выводить перечисление объектов, и каждый объект имеет элемент управления uploadify, который позволяет загружать несколько файлов.Я могу показать вам этот код, если вам нужно его увидеть, но в основном я реализовал более продвинутую версию примера IEnumerable<HttpPostedFileBase> Фила Хаака здесь .

Я добавил код кСобытие onComplete для вывода нескольких дополнительных полей формы, которые позволяют мне добавлять подписи к каждому загруженному файлу, которые впоследствии автоматически связываются с правильными объектами MVC.Все это прекрасно работает, хотя я уверен, что есть более эффективные способы сделать это.

Проблема, с которой я сталкиваюсь, заключается в том, что MVC3 требует последовательного индекса, начинающегося с нуля, в соглашениях об именах для перечисляемых полей формы.для того, чтобы IEnumerable был принят методом действия.Когда я удаляю один из динамически созданных элементов управления формы (с кнопкой отмены), последовательность индексов нарушается.

Теперь - поскольку существует несколько элементов загрузки, каждый из которых должен поддерживать свой собственный индекс.Я хотел бы иметь возможность расширять каждый экземпляр плагина uploadify, чтобы иметь отслеживаемый атрибут «fileIndex», а также расширять его методом «reindexFiles ()», который будет перебирать все оставшиеся элементы управления и переименовывать и переименовывать их.

Мои методы могут быть грубыми (комментарии приветствуются!), Но вот мой код, который у меня есть на данный момент:

$(document).ready(function () {
    var uploadedIndex = 0;

    $('div[id$="UploadedImages"]').uploadify({
        script: '/ControlPanel/Media/UploadRelatedImages',
        auto: true,
        fileDesc: 'Image Files (*.jpg;*.jpeg;*.gif;*.png)',
        fileExt: '*.jpg;*.jpeg;*.gif;*.png',
        buttonText: 'Select Images',
        fileDataName: 'files',
        multi: true,
        removeCompleted: false,
        simUploadLimit: 3,
        queueSizeLimit: 100,
        sizeLimit: 1048576, // 1Mb max limit
        onSelectOnce: function (event, data) {
            var uploader = $("#" + event.delegateTarget.id);
            var mediaFormatID = uploader.closest('.mediaFormat').children('input[type="hidden"][name$="MediaFormatID"]').first().val();

            var sd = {
                ASPSESSID: $("#ASPSESSID").val(),
                AUTHID: $("#AUTHID").val(),
                mediaFormatID: mediaFormatID // The first grandparent that ends with MediaFormatID, for the hidden field
            };
            uploader.uploadifySettings('scriptData', sd);
            // TODO : The index needs to be managed per instance
            // Reset index (this will reset each time a group of images are uploaded)
            uploadedIndex = 0;
        },
        onComplete: function (event, ID, fileObj, response, data) {
            // Get the json response
            var json = $.parseJSON(response)[0];

            // Get the newly created queue item
            var queueItem = $("#" + event.delegateTarget.id + ID);

            if (json.HasError) {
                // Text error in response - show it and highlight
                queueItem.children('.percentage').html('<br/>' + json.ErrorMessage);
                queueItem.addClass('uploadifyError');
                return false;
            }

            var textBoxId = event.delegateTarget.id + "_" + uploadedIndex + "__Caption";
            var textBoxName = event.delegateTarget.attributes['name'].value + "[" + uploadedIndex + "].Caption";

            var hiddenId = event.delegateTarget.id + "_" + uploadedIndex + "__MediaFormatImageID";
            var hiddenName = event.delegateTarget.attributes['name'].value + "[" + uploadedIndex + "].MediaFormatImageID";

            // Create container
            var container = $("<div/>").addClass('captionContainer');

            // Create bound hidden field
            $('<input />', {
                'type': 'hidden',
                'id': hiddenId,
                'name': hiddenName,
                'value': json.MediaFormatImageID
            }).appendTo(container);

            // Display the image thumb
            $("<img/>", {
                'src': json.ThumbnailPath
            }).appendTo(container);

            // Create Textbox label
            $('<label />', {
                'for': textBoxId
            }).text('Image Caption')
                .appendTo(container);

            // Create bound text box
            $('<input />', {
                'type': 'text',
                'id': textBoxId,
                'name': textBoxName,
                'maxlength': 100
            }).appendTo(container);

            // Append container to queue item
            container.appendTo(queueItem);

            // Increment index
            uploadedIndex++;
        },
        onCancel: function (event, ID, fileObj, data) {
            // Delete the file from the server
            var uploader = $("#" + event.delegateTarget.id);
            // Get image ID from created hidden input
            var hiddenId = event.delegateTarget.id + "_" + uploadedIndex + "__MediaFormatImageID";
            var hidden = $("#" + hiddenId);

            $.ajax({
                url: '/ControlPanel/Media/DeleteRelatedImage',
                type: "POST",
                context: uploader,
                data: {
                    mediaFormatImageID: hidden.val()
                },
                success: function () {
                    // TODO: Reindex form images

                }
            });
        }
    });
});

Метод onCancel неполон и не проверен.Как видите, я использую глобальный индекс для имен файлов, но он не работает ни для каких экземпляров загрузки после первого, так как индекс будет начинаться с последнего сохраненного индекса, а не с 0.однако необходимо поддерживать индекс для каждого элемента uploadify, поскольку пользователь может попытаться добавить больше изображений после добавления первого пакета.

Я рассмотрел функциональность $ .extend ()JQuery, но не мог заставить ничего работать успешно.Любая помощь будет оценена, как всегда.

1 Ответ

1 голос
/ 28 февраля 2012

Проблема, с которой я сталкиваюсь, заключается в том, что поскольку MVC3 требует нуля, последовательный индекс в соглашениях об именах для перечислимой формы поля для того, чтобы IEnumerable был принят методом действия.

Не обязательно. Взгляните на этот пост , а точнее на непоследовательные индексы в конце статьи:

Ну, это все замечательно, но что происходит, когда ты не можешь гарантировать, что представленные значения будут поддерживать последовательный индекс? Например, предположим, что вы хотите разрешить удаление строк перед отправкой список книг через JavaScript. Хорошей новостью является то, что, представляя дополнительный скрытый ввод, вы можете разрешить произвольные индексы. в В приведенном ниже примере мы предоставляем скрытый ввод с суффиксом .Index для каждый элемент нам нужно привязать к списку. Название каждого из них скрытые входы одинаковы, поэтому, как описано ранее, это даст модель связывает хорошую коллекцию индексов, чтобы искать при связывании к списку.

А затем взгляните на замечательный пост Стивена Сандерсона в блоге , в котором он представляет метод расширения Html.BeginCollectionItem, который позволяет вам достичь этого.

...