将json存储在隐藏字段中以反序列化为模型属性列表

时间:2012-06-03 09:24:04

标签: asp.net-mvc json

大家早上好。我一直在思考在我的mvc网络应用程序中使用plupload的最好方法是在后端创建上传文件时使用各自的记录。

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

  1. 创建新记录,使用plupload上传多个文件。
  2. 多个文件(表示每个文件的json字符串系列)存储在客户端上,然后通过隐藏字段发回。
  3. 表单模型上的属性包含这些上传文件的结果,因此我可以处理后端业务。
  4. 模型(没有不相关属性的粗糙)将如下所示:

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

    客户端文件如下所示:

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

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

    我正在思考如何将隐藏字段构造成正确的,以便绑定器知道如何将它们连接到列表,或者做一些自定义反序列化自己将json字符串的集合转换为对象列表。

    在我把银行假日周末丢到mvc之前,有没有人有任何智慧。

2 个答案:

答案 0 :(得分: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&amp; 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;
}
}

n.b 上传器是对plupload的引用, serialize()是一个本地方法,它将文件数组转换为json,并将其发回。

答案 1 :(得分: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创建hiddens:

....
var i = 0;
....
function(data){
     $('form').append('<input type="hidden" name="Files[' +i+'].UniqueId" value"' 
                       + data.UniqueId + '" />');
     i++;
}