1

以下のようなコードがあります

意見:

$("form").live('submit', function () {
var formData = $(this).toObject();

$.ajax({
  url: "../Home/Index",
  type: "POST",
  dataType: "json",
  data: formData,
  success: function (data) {<<Some handling>>
}

コントローラ:

public JsonResult Index(Task task)
{
 //operations on the task object like getting data from task and setting to it.
}

ここではタスクがモデルです。ここでは、フォームが送信されると、フォーム オブジェクトがコントローラーに直接送信され、コントローラーはそれをモデルとして受け取ります。この変換はどのように行われますか? ファイルコンポーネントをフォームに追加しました

<input type="file" name = "file" id="file"/>

モデルタスクにファイル属性を追加しました。

public HttpPostedFileBase file{ get; set; }

しかしnull、コントローラー内のファイルを取得しています。しかし、他のすべての値はうまくいっています。

私を助けてください。私の質問を正しく理解するために追加情報が必要な場合はお知らせください。

4

2 に答える 2

2

通常、リクエスト値をモデルに変換するのはモデル バインダーです。

しかし、あなたの場合、AJAX を使用してファイルを送信しようとしているようです。これはサポートされていません。その理由は、jQuery の ajax メソッドがそれをサポートしていないためです。HTML5 File APIXHR2 オブジェクトを使用するとファイルをサーバーに非同期的にアップロードできるため、クライアント ブラウザーがサポートしている場合に使用できます。次に例を示します。

$(document).on('submit', 'form', function () {
    var xhr = new XMLHttpRequest();
    xhr.open(this.method, this.action);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            alert(xhr.responseText); // handle response.
        }
    };
    xhr.send(new FormData(this));
    return false;
}

また、廃止され jQuery 1.9 で削除されたメソッドでは.on()なく、submit イベントをサブスクライブするメソッドを使用していることにも注意してください。.live()

一方、レガシー ブラウザをサポートする必要がある場合は、Fine Uploaderまたはなどのプラグインを使用してjQuery formこのタスクを達成できます。これらのプラグインは、ブラウザーの機能を検出し、XHR2 をサポートしている場合はそれを使用し、サポートしていない場合は別の手法 (非表示の iframe、フラッシュなど) を使用します。

于 2013-02-19T22:05:56.013 に答える
0

jquery ajax post を直接使用してファイルをアップロードすることはできません。これにはプラグインが必要です。このプラグインを使用できるかもしれません

この質問は、このプラグインを使用するための出発点を示します。

また、@DarinDimitovの提案からも学びました:)

于 2013-02-19T22:05:47.870 に答える