DNN MVC 模块不回发文件

DNN MVC Module not posting file back

我正在构建一个小型 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>

我确实在 github 上使用 dropzone jquery component - which may help you. See my sample Restaurant Menu project 在 MVC 模块中进行了上传。

首先,包含 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) {

    }
});

将 acceptedFiles 更改为您要限制的 mime 类型("application/pdf",等等)。更改 maxFiles 以限制他们一次可以上传的文件数。

编写 MVC 控制器操作以响应 Dropzone 文件上传 url。您可以看到它需要控制器上的操作方法 "Upload" "Menu" (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 });
}