Модуль DNN MVC не отправляет файл обратно

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

Когда форма отправляется обратно, модель представления отправляется обратно нормально, но файл никогда не отправляется. Request.Files всегда равен 0.

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

Мне бы очень не хотелось возвращаться к элементам управления .ascx, чтобы заставить это работать.

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

См. Код ниже:

Просмотр

@inherits DotNetNuke.Web.Mvc.Framework.DnnWebViewPage<NM.Modules.FlexEventsCreate.Models.FlexEventViewModel>
@using DotNetNuke.Web.Mvc.Helpers

<input type="file" id="fileUp"/>
<input type="submit" id="btnSubmit" />

Контроллер

[DnnHandleError]
public class ItemController : DnnController
{
    [HttpPost]
    public ActionResult ShowForm(FlexEventViewModel flexEvent)
    {
        if (ModelState.IsValid)
        {
            var file = Request.Files;

            if (file.Count != 0)
            {
                //do something  
            }

            //return RedirectToDefaultRoute();
        }

        return View(flexEvent);
    }
}

Отрендеренный DNN HTML выглядит так (я его упростил)

<form method="post" action="/Test" id="Form" enctype="multipart/form-data">

    <!-- Begin Content areas -->
    <div>
        <div class="row">
            <div class="medium-9 columns">
                <div id="dnn_LeftPane">
                    <div class="DnnModule DnnModule-DnnModule-747">
                        <a name="747"></a>

                        <div class="DnnF_Title_h1 SpacingBottom">
                            <h1><span id="dnn_ctr747_dnnTITLE_titleLabel" class="TitleH1"></span>

    </h1>
                            <div id="dnn_ctr747_ContentPane">
                                <!-- Start_Module_747 -->
                                <div id="dnn_ctr747_ModuleContent">
                                    <div id="dnn_ctr747_ShowForm_Prog" class="RadAjax RadAjax_Default" style="display:none;">
                                        <div class="raDiv">

                                        </div>
                                        <div class="raColor raTransp">

                                        </div>
                                    </div>
                                    <div class="RadAjaxPanel" id="dnn_ctr747_dnn_ctr747_ShowForm_UPPanel">
                                        <div id="dnn_ctr747_ShowForm_UP">
                                            <!-- 2013.2.717.40 -->
                                            <div id="mvcContainer-747">

                                                <input type="file" id="fileUp">
                                                <input type="submit" id="btnSubmit">
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

</form>

person Nanz    schedule 26.07.2017    source источник
comment
Покажите свой тег формы. Есть ли у него необходимый атрибут enctype= multipart/form-data   -  person    schedule 26.07.2017
comment
В DNN тег формы находится в начале страницы, поэтому, когда вы создаете модуль, вы не включаете его. ‹Form method = post action = / Test id = Form enctype = multipart / form-data›   -  person Nanz    schedule 26.07.2017
comment
Есть обновления по этому вопросу? Ответ сработал для вас?   -  person DotNetNuclear    schedule 25.08.2017


Ответы (1)


Я сделал загрузку в модуле MVC, используя компонент jquery dropzone, который может вам помочь. См. Мой образец проект меню ресторана на github.

Сначала включите скрипт dropzone и css:

@using DotNetNuke.Web.Client.ClientResourceManagement
@{
    ClientResourceManager.RegisterStyleSheet(Dnn.DnnPage, "~/DesktopModules/MVC/DotNetNuclear/RestaurantMenu/Resources/dropzone/css/dropzone.css");
    ClientResourceManager.RegisterScript(Dnn.DnnPage, "~/DesktopModules/MVC/DotNetNuclear/RestaurantMenu/Resources/dropzone/js/dropzone.min.js", 100);
}

Затем поместите контейнер div для компонента загрузки:

<div id="dZUpload" class="uploadform dropzone no-margin dz-clickable">
      <div class="dz-default dz-message"></div>
</div>

Инициализируйте компонент и сообщите ему, какой тип и сколько файлов можно загрузить:

$("#dZUpload").dropzone({
    acceptedFiles: "image/jpeg,image/png,image/gif",
    url: '@Url.Action("Upload", "Menu")',
    maxFiles: 1, // Number of files at a time
    maxFilesize: 1, //in MB
    addRemoveLinks: true,
    maxfilesexceeded: function (file) {
        alert('You have uploaded more than 1 Image. Only the first file will be uploaded!');
    },
    success: function (response) {

    }
});

Измените значения acceptFiles на mimetypes, которые вы ограничиваете («application / pdf» и т. Д.). Измените maxFiles, чтобы ограничить количество файлов, которые они могут загружать за раз.

Напишите действие контроллера MVC для ответа на URL-адрес загрузки файла Dropzone. Вы можете видеть, что он ожидает метода действия «Загрузить» в контроллере «Меню» (MenuController.Upload):

public JsonResult Upload()
{
    string imageUrl = string.Empty;
    string imgPath = Server.MapPath("~/Portals/0/Restaurant/");
    if (!Directory.Exists(imgPath))
    {
        Directory.CreateDirectory(imgPath);
    }

    foreach (string s in Request.Files)
    {
        var file = Request.Files[s];
        if (file.ContentLength > 0)
        {
            string fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(imgPath, fileName);
            file.SaveAs(path);
            imageUrl = string.Format("/Portals/0/Restaurant/{0}", fileName);
        }
    }

    return Json(new { img = imageUrl, thumb = imageUrl });
}
person DotNetNuclear    schedule 26.07.2017
comment
Спасибо за это, позвольте мне попробовать включить это в свой модуль! - person Nanz; 27.07.2017