4

Jquery Ajax Formを使用してファイルをアップロードしています。これはChromeとFirefoxでうまく機能しますが、IEでは機能しません。アップロードしようとしているファイルを保存するように指示するウィンドウがポップアップ表示されます。

私のコードのいくつかの例は、必要に応じて、ここで儀式です:HTML:

<div class="addNewDocumentContent">
<form id="AddNewDocForm" action="@Url.Action("AddNewDocument", "BidForm")" enctype="multipart/form-data" method="post">
<div>
    <input name="File" type="file" style="width: 80%;" />
</div>
<div>
    <label>
        @Labels.Name</label>
    <input type="text" name="Name" style="width: 80%;" />
</div>
<div style="text-align: right;">
    <button type="button" name="Back" value="Back">
       @Buttons.GoBack
    </button>
    <button type="submit" name="Add" value="Back">
        @Buttons.Add
    </button>
</div>
</form>

JS:

//Document Ready=============================================================================
$(function () { 

    $('#AddNewDocForm').ajaxForm({
        type: 'POST',
        beforeSubmit: function () {
            return $("#AddNewDocForm").valid();
        },
        success: function (documents) {
            FillDocuments(documents);
            $('#dialogAddNewDocument').dialog('close');
        }
    });
});
//Validate====================================================================================
//Validation=====================================================================================
$(function () {
    $("#AddNewDocForm").validate({
        ignore: ":not(:visible)",
        rules: {
            File: "required",
            Name: "required"
        }
    });
});
//=========================================================================================

アクション

[HttpPost]
    public JsonResult AddNewDocument(DocumentModel document)
    {
        if (ModelState.IsValid)
        {
            List<DocumentModel> documents = null;
            if (Session["Documents"] != null)
            {
                documents = (List<DocumentModel>)Session["Documents"];
                var doc = documents.OrderByDescending(x => x.Number).Take(1).FirstOrDefault();

                document.Number = doc != null ? doc.Number + 1 : 1;
                document.FileName = document.File != null ? document.File.FileName : document.FileName;
                documents.Add(document);
            }
            else
            {
                documents = new List<DocumentModel>();
                document.Number = 1;
                document.FileName = document.File != null ? document.File.FileName : document.FileName;
                documents.Add(document);
                Session["Documents"] = documents;
            }

            var displaydocs = documents.Select(x => new
            {
                Name = x.Name,
                Number = x.Number,
                File = x.File != null ? x.File.FileName : x.FileName,
                Route = x.Route != null ? x.Route : "#",
            });

            return Json(displaydocs, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return null;
        }
    }

そして最後にモデル:

  public class DocumentModel
{
    public int Number { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public HttpPostedFileBase File { get; set; }

    public string FileName { get; set; }
    public string Route { get; set; }
}

繰り返しますが、IE8を除くすべてのブラウザで動作します。私はおそらく唯一の人ではありませんが、私はそこに答えを見つけていません。

4

3 に答える 3

4

この質問何度も聞かれました。投稿する前に検索してください。ドキュメントにはそれが明確に記載されています:

XMLHttpRequestレベル2をサポートするブラウザーは、ファイルをシームレスにアップロードでき、アップロードが進むにつれて進行状況の更新を取得することもできます。古いブラウザの場合、XMLHttpRequestオブジェクトのレベル1の実装を使用してファイルをアップロードすることはできないため、iframeを含むフォールバックテクノロジが使用されます。これは一般的なフォールバック手法ですが、固有の制限があります。iframe要素は、フォームの送信操作のターゲットとして使用されます。これは、サーバーの応答がiframeに書き込まれることを意味します。これは、応答タイプがHTMLまたはXMLの場合は問題ありませんが、応答タイプがスクリプトまたはJSONの場合は同様に機能しません。どちらにも、HTMLマークアップで見つかった場合にエンティティ参照を使用して表現する必要のある文字が含まれていることがよくあります。

iframeモードを使用する場合のスクリプトおよびJSON応答の課題を説明するために、フォームプラグインでは、これらの応答をtextarea要素に埋め込むことができます。ファイルのアップロードなどと組み合わせて使用​​する場合は、これらの応答タイプに対してこれを行うことをお勧めします。ブラウザ。ただし、フォームにファイル入力がない場合、リクエストは通常​​のXHRを使用してフォームを送信することに注意してください(iframeではありません)。これにより、テキストエリアを使用する場合と使用しない場合を知るためにサーバーコードに負担がかかります。

コントローラアクションからJSONを返すため、ドキュメントの内容を尊重する必要があります=><textarea>要素でラップします。

于 2012-06-28T07:19:49.073 に答える
3

textareaはまだ試していませんが、アクション内でtext/htmlとして返されるコンテンツタイプを定義すると正常に機能します。

 return new JsonResult() { ContentType = "text/html", Data = result };
于 2012-06-28T21:30:25.263 に答える
0

キャッシュを追加してみてください:AJAX呼び出し内に「false」...次のようなもの:

 $.ajax({
 type:"POST", 
 url:'process.php',
 cache:'false',   //IE FIX
 data: data, 
 success: function(){ //on success do something...

 } 
 });
于 2012-06-27T21:36:10.923 に答える