【问题标题】:ASP NET MVC RAZOR Upload Multiple Images FileListASP NET MVC RAZOR 上传多个图像文件列表
【发布时间】:2017-06-06 13:29:53
【问题描述】:

我是 asp 网络的新手,我有一个图像列表,我想通过 javascript 发送到控制器。

我正在使用 FileList,这是一个示例。 .Create.cshtml

<div class="form-group">
    @Html.LabelFor(model => model.description, "Escolha as Imagens", htmlAttributes: new { @class = "control-label col-md-2" })
    <input id="files" type="file" name="files[]" />
    <br>
    <div id="preview"></div>
</div>
@section Scripts{
    <script type="text/javascript">
        function handleFileSelect(evt) {

            var files = evt.target.files;
            var f = files[0];
            //kiem tra co fai file anh
            if (f.type.match('image.*')) {
                var reader = new FileReader();

                reader.onload = (function(theFile) {
                    return function(e) {
                        var span = document.createElement('span');
                        span.innerHTML = [
                            '<img class="thumb" src="', e.target.result, '" title="', escape(theFile.name),
                            '"/><span class="remove_img_preview"></span>'
                        ].join('');
                        document.getElementById('preview').insertBefore(span, null);
                    };
                })(f);

                reader.readAsDataURL(f);
            }
        }

        $('#files').change(function(evt) {
            handleFileSelect(evt);
        });
        $('#preview').on('click',
            '.remove_img_preview',
            function() {
                $(this).parent('span').remove();
            });

        $('#btnSave').click(function() {

            $.ajax({
                url: '/Dishes/Create',
                data: { files: files },
                type: "POST",
                cache: false,
                datatype: "html",
                success: function(data) {
                    console.log(data);
                },
                error: function(jqXhr, textStatus, errorThrown) {
                    //do your own thing
                    alert("fail");
                }
            });
        });

    </script>
}
</fieldset>
<div class="form-group">
    <div class="footer text-center">
        <button class="btn btn-fill btn-info" name="btnSave" id="btnSave">Inserir novo</button>
    </div>
</div>

Controller.cs

public ActionResult Create()
    {
        ViewBag.idTypeDish = new SelectList(db.TypeDish, "idTypeDish", "name");
        return View();
    }



    // POST: Dishes/Create
    [HttpPost]
    public ActionResult Create(IEnumerable<HttpPostedFileBase> files)
    {


        return View();

    }

在控制器中,文件始终为空。 我正在使用那个例子,http://jsfiddle.net/Lwczca6p/1/,我只是适应我的项目。

【问题讨论】:

  • 您可能不需要做所有这些,但如果您要允许上传多个文件,那么您需要在文件输入中添加multiple="multiple"(假设无论如何你都在使用 html5
  • @Ortund Ya 我知道你的意思,但是如果他选择了 2 张图像,然后他会选择另一张图像,会发生什么?我有一个 FileList,我无法将 FileList 发送到控制器?
  • @Ortund 我正在使用所有这些代码,因为在上传到服务器之前,用户可以预览图像并根据需要删除。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

您遇到了一些问题。首先,您尝试在 AJAX 中使用 files,但该变量是在另一个函数的范围内定义的(即您在此处无权访问它)。其次,使用jQuery的$.ajax做文件上传时,需要将processData选项设置为false。以下是我的处理方式:

$('#MyForm').on('submit', function (e) {
    e.preventDefault();
    var formData = new FormData(this); // `this` is the form instance
    $.ajax({
        url: '/path/to/handler',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: 'multipart/form-data',
        success: function (data, textStatus, jqXHR) {
            // do something on success
        },
        error: function (jqXHR, textStatus, errorThrown) {
            // do something on error
        }
    });
});

【讨论】:

  • 嘿,感谢您的回答,但它如何在控制器上工作?我会有什么参数?我以前从未使用过 FormData。
【解决方案2】:

试试这个,首先为你的视图创建一个模型:

public class FileModel  
{  
    [Required(ErrorMessage ="Please select file.")]  
    [Display(Name ="Browse File")]  
    public HttpPostedFileBase[] files { get; set; }  

}  

然后,编辑您的视图(要启用上传许多文件,您需要在元素中放置 multiple="multiple"):

@model Models.FileModel

@using (Html.BeginForm("Create", "YourController", FormMethod.Post, new { enctype = "multipart/form-data" }))  
{  
    @Html.AntiForgeryToken()  

    <div class="form-horizontal">  
        <hr />  
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })  
        <div class="form-group">  
            @Html.LabelFor(model => model.files, htmlAttributes: new { @class = "control-label col-md-2" })  
            <div class="col-md-10">  
                @Html.TextBoxFor(model => model.files, "", new { @type = "file", @multiple = "multiple" })  
                @Html.ValidationMessageFor(model => model.files, "", new { @class = "text-danger" })  
            </div>  
        </div>  
        <div class="form-group">  
            <div class="col-md-offset-2 col-md-10">  
                <input type="submit"  value="Upload" class="btn btn-primary" />  
            </div>  
        </div>  

        </div>  
}  

【讨论】:

  • 嗯,谢谢你的回答!但这并不是我真正想要的……我希望能够一张一张选择一张图片,最后将文件数组发送到控制器。
  • 哦,好的。你试过使用 Dropzone 吗? dropzonejs.com我用过一次asp.net mvc。如果你愿意,我可以给你一个例子。
  • 不,我从未使用过 dropzone,但从我读到的内容会立即上传到服务器,这不是我想要的...我希望能够添加和删除图像,然后在何时上传产品已注册。但是,如果您不介意,我想举个例子。
  • 我在博客中写了这篇关于 dropzone 的文章,希望对您有所帮助。 tiagoavilablog.com/utilizando-dropzonejs-com-asp-net-mvc
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2014-11-04
  • 2011-02-22
  • 1970-01-01
  • 2014-04-25
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多