5

大家早上好。我一直在思考将 plupload 与我的 mvc Web 应用程序一起使用的最佳方式,以便在后端创建时将上传的文件与其各自的记录结合起来。

我终于把它归结为以下过程 - 这将适用于新的和现有的记录(想想 CMS):

  1. 创建新记录,使用plupload上传多个文件。
  2. 多个文件(代表每个文件的一系列 json 字符串)存储在客户端上,然后通过隐藏字段发回。
  3. 表单模型上的一个属性保存了这些上传文件的结果,因此我可以处理后端业务。

该模型(没有无关属性的绒毛)将如下所示:

public class Record{
    public IList<ClientFile> Files {get;set;}
}

客户端文件如下所示:

public class ClientFile{
    public string UniqueId{get;set;}
}

我的问题在于每次成功上传后客户端上的内容(ClientFile 的 json 字符串),以及如何正确地将其放入隐藏字段并正确绑定,以便在模型中准备好客户端文件列表。

我正在考虑正确构建隐藏字段以便活页夹知道如何将它们连接到列表,或者自己进行一些自定义反序列化以将 json 字符串的集合转换为对象列表.

在我失去银行假期周末到 mvc 之前,有没有人有任何智慧。

4

2 回答 2

6

这就是我现在实现它的方式:

public class ProductModel
{
    // This is the field bound to the view (hidden field)
    public string FilesValue
    {
        get
        {
            return Files.ToJson<IEnumerable<Plupload>>();
        }
        set
        {
            Files = value.FromJson<IEnumerable<Plupload>>();
        }
    }
    public IEnumerable<Plupload> Files { get; private set; }
}

(ToJson 和 FromJson 只是我用来快速序列化和反序列化对象的扩展方法。)

在我看来:

<input type="hidden" name="FilesValue" id="FilesValue" />

我有一个内联脚本,可以在加载表单时转换隐藏字段的值:

Bundles.AddInlineScript("fileManager.dserialize('" + Html.Raw(Model.FilesValue) + "')");

在表单发布到服务器之前运行的客户端脚本:

function preSubmit(e) {
// need to force upload
var $form = $(e.currentTarget),
    hidden = $form.find('#FilesValue')[0];
if (uploader.files.length > 0) {
  uploader.bind('UploadComplete', function () {
    serialize(hidden);
    $form.trigger('submit');
  });
  uploader.start();
  return false;
} else {
  serialize(hidden);
  return true;
}
}

nb uploader是对 plupload 的引用,而serialize()是一种本地方法,它将文件数组转换为 json 并被回发。

于 2012-10-08T20:10:33.327 回答
2

发布前您的客户端 html 应该是这样的:

<input type="hidden" name="Files[0].UniqueId" value"XX" />
<input type="hidden" name="Files[1].UniqueId" value"XX" />
<input type="hidden" name="Files[2].UniqueId" value"XX" />

假设您为每个上传的文件都有一个回调函数,其中包含一个包含 JSON 字符串的参数,您可以在上传每个文件后使用 jQuery 创建动态隐藏,如下所示:

....
var i = 0;
....
function(data){
     $('form').append('<input type="hidden" name="Files[' +i+'].UniqueId" value"' 
                       + data.UniqueId + '" />');
     i++;
}
于 2012-09-06T22:27:18.443 回答