1

C#MVCコントローラーを介してJsonを返します。他のブラウザは正常に動作しますが、Internet Explorer(IE9)は返されたJsonデータをテキストファイルとして保存しようとします。これが起こらないようにする方法はありますか?

//MVC Controller Code...
return Json(new { redirectToUrl = Url.Action("Create", "Album",
                  new { url = url, isLocalFile = isLocalFile})});

//Clientside Javascript Code
$("#uploadImageForm").ajaxForm({
  beforeSubmit: function () {

  },
  success: function (data, textStatus, xhr) {
          window.location.href = data.redirectToUrl;
  },
  error: function (data, textStatus, xhr) {
  } 
});

returnJsonメソッドの2番目の引数に「text/plain」と「text/json」を追加しようとしましたが、機能しません。

どうもありがとう!

4

2 に答える 2

2

プラグインのドキュメントからの引用:jquery.form

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

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

つまり、フォームにファイル入力フィールドが含まれていて、このフォームをJSONを返すコントローラーアクションに送信する場合は、このJSONを<textarea>タグでラップする必要があります。

したがって、応答は次のようにはなりません。

{ "redirectToUrl":"some url" }

次のようになります。

<textarea>{ "redirectToUrl":"some url" }</textarea>

これを実現するには、応答をこれらのタグでラップするカスタムアクション結果を使用できます。

public class TextareaJsonResult : JsonResult
{
    public TextareaJsonResult(object data)
    {
        this.Data = data;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        bool shouldWrap = !context.HttpContext.Request.IsAjaxRequest();
        if (shouldWrap)
        {
            response.Write("<textarea>");
        }

        base.ExecuteResult(context);

        if (shouldWrap)
        {
            response.ContentType = "text/html";
            response.Write("</textarea>");
        }
    }
}

次に、コントローラーアクションに次のカスタム結果を返してもらいます。

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    // ... some processing

    var redirectToUrl = Url.Action(
        "Create", 
        "Album",
        new { url = url, isLocalFile = isLocalFile }
    );
    return new TextareaJsonResult(new { redirectToUrl = redirectToUrl });
}

明らかに、AJAX成功コールバックでは、テストしてこの違いを考慮する必要があります。typeof resultレガシーブラウザ(Internet Explorerなど)の場合は、手動で応答を解析します。リンク先のページのソースコードをご覧ください。

しかし、そうは言っても、成功コールバックでは、サーバーから返されたJSON応答に含まれるコントローラーアクションにリダイレクトしていることがわかります。ここに私の質問があります:リダイレクトする場合、そもそもAJAXを使用する意味は何ですか?コントローラーアクションへの標準フォームポストを使用して、コントローラーアクションに直接リダイレクトを実行させてみませんか?同じページにとどまりたい場合は、AJAXを使用する必要があります。

于 2012-06-16T09:19:30.517 に答える
1

私はジェシーのコメントに同意します、これはおそらく彼が提供したリンクの複製です。

そのため、代替案を提供します。私は、fiddlerhttp://www.fiddler2.com/fiddler2/に似たhttpプロキシを使用してjsonがネットワーク経由でやってくるのを見るのが好きです。すべてのブラウザで動作するため、フィドラーについて説明します。利点は、解析されたjsonのツリービューを取得できることです。探しているものを読み、見つけるのがはるかに簡単です。

また、FirefoxのFirebug、Chrome開発ツール、つまり開発ツールはすべて同じ機能を提供すると思います。(Chromeにはツリービューがあることを知っています。Firebugにツリービューがあることを覚えていると思います。他の2つを考慮すると、最新のIEにツリービューがない場合は驚きます。)

于 2012-06-16T06:17:21.340 に答える