5

みんなおはよう。私は、mvc Webアプリでpluploadを使用して、アップロードされたファイルをバックエンドで作成されたときにそれぞれのレコードと結合するための最良の方法について考えてきました。

私はついにそれを次のプロセスに要約しました-これは新しいレコードと既存のレコードの両方で機能します(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 are just an extension methods I use to serialise and deserialise objects quickly.)

In my view:

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

I have an inline script that converts the value of the hidden field when the form is loaded:

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

And the client script which runs before the form is posted to the server:

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 uploader is a reference to plupload and serialize() is a local method which turns the file array into json which gets posted back.

于 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 に答える