web-dev-qa-db-ja.com

MVCコントローラーのリターンコンテンツとリターンJson Ajax

MVCで、AjaxコールバックでContentを返すことが失敗することがあるのに、単純な文字列オブジェクトであってもJsonを返すのはなぜですか?

失敗した場合でも、常にコールバックでアクセスした場合、データは引き続き使用可能です...

更新:

Ajax呼び出しでcontentTypeをtext/xmlに設定すると、応答でエラーメッセージが入力されなくなります。

AJAX:

$.ajax({
    cache: false,
    type: "GET",
    contentType: "application/json; charset=utf-8",
    dataType: 'json',
    url: "/MyController/GetFooString",
    data: { },
    success: function (data) {
        alert(data);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert("Ajax Failed!!!");
    }
}); // end ajax call

失敗するコントローラーアクション(時々)

失敗した場合でも、データは利用可能です。

public ActionResult GetFooString()
{
    String Foo = "This is my foo string.";
    return Content(Foo);
} // end GetFooString

常に機能するコントローラーアクション

public ActionResult GetFooString()
{
    String Foo = "This is my foo string.";
    return Json(Foo, JsonRequestBehavior.AllowGet);
} // end GetFooString
10
silencedmessage

Content(Foo);を使用すると、MIMEタイプヘッダーのない応答が送信されます。これは、このオーバーロードを使用するときにContentTypeを設定していないために発生します。 Content-Typeが設定されていない場合、jQueryはコンテンツタイプをguessしようとします。その場合、実際に推測できるかどうかは、実際のコンテンツと基礎となるブラウザーによって異なります。 here を参照してください:

dataType(デフォルト:Intelligent Guess(xml、json、script、またはhtml))

一方、Json(...)explicitly は、コンテンツタイプを"application/json"そのため、jQueryはコンテンツを何として扱うかを正確に知っています。

2nd overload を使用してContentTypeを指定すると、Contentから一貫した結果を得ることができます。

return Content(Foo, "application/json"); // or "application/xml" if you're sending XML

ただし、常にJSONを扱う場合は、JsonResultを使用することをお勧めします

return Json(Foo, JsonRequestBehavior.AllowGet); 
16
Mrchief