一种形式的多个放置区

Posted

技术标签:

【中文标题】一种形式的多个放置区【英文标题】:Multiple dropzone in one form 【发布时间】:2018-05-21 15:34:39 【问题描述】:

我在一个页面中使用 dropzone。事实上,用户可以动态添加一个包含 DropZone 的对象,例如一个城市可以有 N 个房子,对于每个房子,我让用户通过 DropZone 发送文件。

问题是我无法将上传的文件绑定到 ASP 模型。目前它甚至没有到达控制器。

这是它生成的 html

<div class="house0">
<div class="dropzone dz-clickable" id="houseDropzone0">
<div class="dz-default dz-message" data-dz-message="" style="display: block;">
                    <span>Drop files here to upload</span>
                </div>
            </div>
</div>

<div class="house1">
<div class="dropzone dz-clickable" id="houseDropzone1">
<div class="dz-default dz-message" data-dz-message="" style="display: block;">
                    <span>Drop files here to upload</span>
                </div>
            </div>
</div>

这是我完成的 javascript

//Foreach houses, create a dropzone element and stock it in the table
var dropzones = [];
var housesList= @Html.Raw(Json.Encode(Model.housesList));
for (var i = 0; i < housesList.length; i++) 
                //create the dropzone for the house
                var currentHouse = housesList[i];
                dropzones.push(createHouseDropzoneForId(currentHouse ,i));
            


//Instanciate each dropzone
function createActionDropzoneForId(id) 
            return new Dropzone("#actionDropzone" + id,
                
                    url: "/houseUrl/" + id,
                    paramName: 'houseList[' + id+ '].files',
                    autoProcessQueue: false
                );
        

//Handle the submit event to process the files alongside the data
$("input[type=submit]").on("click", function (e) 
            e.preventDefault();
            e.stopPropagation();

            var form = $(this).closest('form');
            if (form.valid() == true) 
                var dropzones = dropzones;
                dropzones.forEach(function (element) 
                    if (element.getQueuedFiles().length > 0) 
                        element.processQueue();
                     else 
                        element.uploadFiles([]); //send empty
                    
                )

            

        );

这是应该绑定的模型(在我的 ASP 控制器中):

城市类:

public class City
    
        public List<Houses> housesList  get; set; 
        // Other properties as postal code, name, etc

房屋类:

public class House
    
        public HttpPostedFileBase[] files  get; set; 
        // Other properties as color, name, etc

【问题讨论】:

@clement 你也可以为你的剃刀视图发布代码吗? 【参考方案1】:

解决此问题的一种方法是确保您的 razor 视图包含将 Dropzone 元素绑定到模型的 @using(Html.BeginForm) 指令。

我注意到您对所使用的 Dropzone 元素的定义:

...
paramName: 'houseList[' + id+ '].files',
...

这应该是问题的原因,因为您的模型当前期望具有此配置的 Dropzones:

...
paramName: 'files',
...

要解决此问题,我建议您通过在模型中定义以下属性来扩充您的模型以支持多个放置区:

public HttpPostedFileBase[] houseList-1-files  get; set; 
public HttpPostedFileBase[] houseList-2-files  get; set; 
public HttpPostedFileBase[] houseList-3-files  get; set; 

还将dropzone定义修改为:

...
paramName: 'houseList-' + id+ '-files',
...

然后您可以修改接收到的 HttpPostedFileBase 对象以适合您的使用:

public List<Houses> housesList  get; set; 

通过实例化新的 House 对象。

【讨论】:

以上是关于一种形式的多个放置区的主要内容,如果未能解决你的问题,请参考以下文章

在具有相同类的多个可放置 div 上拖动图像

Ng2 Dragula 重新排序相同的数组多个放置区域

如何在一页上放置多个画布js动画。 (创建js)

如何将两个或多个元素并排放置并溢出?

将多个元素同时放置到一行

一种形式的多个单选按钮组