MVCで、AjaxコールバックでContent
を返すことが失敗することがあるのに、単純な文字列オブジェクトであってもJsonを返すのはなぜですか?
失敗した場合でも、常にコールバックでアクセスした場合、データは引き続き使用可能です...
Ajax呼び出しでcontentTypeをtext/xml
に設定すると、応答でエラーメッセージが入力されなくなります。
$.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
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);