0

SWFUpload を使用してファイルをアップロードしています。ファイルと一緒に渡す必要があるデータを取得するために、post パラメータを swfupload に追加しています。問題は、コントローラ メソッドが swfupload によって呼び出されたときに、私が作成したカスタム モデル バインダーが呼び出されないことです。モデルの一部のプロパティは設定されていますが、カスタム バインダーによって制御されているプロパティは設定されていません。これは、既定のモデル バインダーを使用していることを意味します。

次の JQuery メソッドを使用すると、すべてが意図したとおりに機能します。したがって、問題は、カスタム モデル バインダーが正しく設定されていないことではありません。

$.post('AsyncUpload', $('#uploadform').serialize());

以下は、投稿パラメーターを設定してアップロード プロセスを開始するために使用しているコードです。私はsetPostParams関数を認識していますが、何らかの理由で機能していなかったため、回避策であることに注意してください。また、サーバー側の Request 変数で post パラメータが正しく設定されていることを確認したことにも注意してください。

$('#uploadbutton').click(function (e) {
    e.preventDefault();
    var data = $('#uploadform').serialize();
    var res = $.parseQuery(data);

    for (key in res) {
            swfu.addPostParam(key, res[key]);
    }

    swfu.startUpload();
});

関連する swfupload 変数は次のように設定されます。

upload_url: '<%= Url.Action("AsyncUpload")%>',  //This becomes /Home/AsyncUpload
use_query_string: true,  // I have also tried setting this to false to no effect

これは私のコントローラーメソッドです。

[HttpPost]
public bool AsyncUpload(EditModel model)
{
    if (Request.Files.Count <= 0)
        return false;

    return true;
}

カスタム モデル バインダーが呼び出されない理由はありますか?

4

1 に答える 1

0

問題の原因は文字エンコーディングであることが判明しました。私のカスタム モデル バインダーは、Dictionary プロパティを処理するように構築されています。

私のモデルは次のようになります。

public class EditModel
{
    public string Name { get; set; }
    public Dictionary<int, string> Type { get; set; }
}

私の質問で述べたように、コントローラーのメソッドは次のようになります。

[HttpPost]
public bool AsyncUpload(EditModel model)
{
    if (Request.Files.Count <= 0)
        return false;

    return true;
}

クライアント側には、テキスト ボックス コントロールとチェックボックスがあります。テキストボックスは文字列プロパティにマップされます。チェックボックスはディクショナリ プロパティにマップされ、「Type[0]」、「Type[7]」などの名前が付けられます。これをカスタム モデル バインダーで解析して、ブラケットからキーを抽出します。

jQuery関数を呼び出すと、すべてが期待どおりに機能するようになりました

$.get('AsyncUpload', $('#uploadform').serialize());

コントローラーに送信されるクエリ文字列は

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%5B0%5D

Type%5B0%5D は Type[0] にデコードされます。MVC はそれを辞書として認識し、レースに出ます。

既にエンコードされた文字列を SWFUpload の addPostParam 関数に渡すことが問題でした。私が設定していた値「Type%5B0%5D」を取得し、「%」を %25 にエンコードしていました。したがって、SWFUpload からのクエリ文字列は次のようになります。

http://127.0.0.1/Home/AsyncUpload?Name=John&Type%255B0%255D

型は、MVC によって辞書として認識されない Type%5B0%5D としてデコードされました。デフォルトのモデル バインダーは単純な文字列プロパティの処理方法を認識しているため、名前は正しく設定されます。

この問題を解決するために、JavaScript に次の変更を加えました。ブラケットのエンコードを実際のブラケットに置き換えます。それらはサーバーへの呼び出しでエンコードされ、すべてが宇宙でうまくいきます。

for (key in res) {
    var value = res[key];
    var fixedKey = key;
    fixedKey = fixedKey.replace('%5B', '[');
    fixedKey = fixedKey.replace('%5D', ']');
    swfu.addPostParam(fixedKey, value);
}

私の投稿にコメントしてくれた Matthew Abbott に感謝します。これにより、サーバーに渡される名前をもう一度確認することができました。あなたは私の正気を救った。

于 2010-07-01T19:55:41.363 に答える