この質問に関する具体的な答えを見つけることができませんでした。 this 質問などからの投稿と後続の投稿を表示しましたが、実際に読んだのは、JsonResultにハードコードされたコンテンツタイプがあり、パフォーマンスの向上がまったくないということだけです。
両方の結果がJsonを返すことができる場合、ActionResultではなくJsonResultを使用する必要がある理由.
public ActionResult()
{
return Json(foo)
}
public JsonResult()
{
return Json(bar)
}
ActionResultがジョブを完了できず、JsonResultmustを使用するシナリオを誰でも説明できますか。そうでない場合、最初にJsonResultが存在するのはなぜですか。
JsonResult
でActionResult
を使用する場合
私は通常、具体的な結果を返します(例えば、JsonResult
、ViewResult
)、私の長所があります:
PartialViewResult
およびViewResult
を結果タイプとして正確に。このアプローチをサポートするリンクがいくつかあります。
Pro ASP.NET MVC 3 Framework からの引用があります:
注リスト内のアクションメソッドの戻り値の型は
ViewResult
であることに注意してください。より一般的なActionResult
型を指定した場合、メソッドはコンパイルおよび動作します。実際、一部のMVCプログラマーは、すべてのアクションメソッドの結果をActionResult
として定義しますが、常により具体的な型を返すことがわかっている場合でもです。各結果タイプをどのように使用できるかを明確にするために、以下の例でこのプラクティスに特に熱心に取り組んでいますが、実際のプロジェクトではよりリラックスする傾向があります。
アクションが異なるタイプの結果を返す必要がある場合にのみ、具体的なものに対してActionResult
を使用します。しかし、それは一般的な状況ではありません。
ActionResult
は抽象クラスであるため、このタイプのインスタンスを単純に作成して返すことはできません。 JsonResult
は具象なので、そのインスタンスを作成してアクションメソッドから戻ることができます。 ActionResult
から派生した他の多くのタイプがあります 。基本的にそれらはすべて ExecuteResult
メソッドをオーバーライドするために使用 です。
_public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext context);
}
_
このメソッドはControllerActionInvoker
によって呼び出され、response
オブジェクトにデータを書き込むロジックを実装します。
ControllerActionInvoker
は具体的な結果を知らないため、から派生した結果を処理できます。 ActionResult
およびExecuteResult
を実装します。
どちらの場合も、例でJsonResult
型のインスタンスを返し、Json(model)
はJsonResult
のインスタンスを作成するファクトリメソッドです。
別のSOの質問があります メソッドのデータ型をできるだけ具体的にするか、より一般的にする方が良いですか? メソッドパラメーターと戻り値のベストプラクティスについて説明します。
一般的なアイデアは、抽象型をパラメータとして提供することですより広い範囲のパラメーターを処理します。 クライアントがそれらをキャストまたは変換する必要がないように、具体的な十分な型を返します。
MVCコントローラーのすべての一般的な戻り値の種類の名前が「結果」で終わることに気づいたかもしれません。ほとんどのアクションはActionResultを返します。 documentation を見ると、いくつかのより特殊化された結果タイプが抽象クラスActionResultを継承していることがわかります。このため、すべてのアクションでActionResultを返すことができ、さまざまなタイプを返すことさえできます。例:
public ActionResult View(int id)
{
var result = _repository.Find(id);
if(result == null)
return HttpNotFound(); //HttpNotFoundResult, which inherits from HttpStatusCodeResult
return View(result); //ViewResult
}
これらすべてにより、リクエストに基づいて異なるコンテンツを簡単に返すことができます。それでは、なぜActionResultではなくJsonResultを使用するのでしょうか?おそらく誤解はないので、実際にはonlyだけでJSONを返すことができます。
それは単純な多態性原則を固守しているだけです。
ActionResult
、JsonResult
、ViewResult
(およびその他)の基本型である抽象ContentResult
を返すようにメソッドシグネチャを定義することにより、implementationアクションは、どのActionResult
を返すかを決定します。
例えば:
_public ActionResult GetData(int id)
{
var data = .... // some data
if (Request.AcceptTypes.Contains("json"))
return Json(data);
else
return View(data);
}
_
実際には、OOPでメソッドの戻り値の型をできるだけ抽象的に定義するのが一般的です。Linqの_IEnumerable<>
_の使用法も.NET BCLで見つけることができます。例えば:
_public static IEnumerable<T> Where<T>
(
this IEnumerable<T> source,
Func<T, bool> predicate
);
_
Where()
メソッドは_IEnumerable<T>
_を返すように宣言されているため、Array
、List
、HashSet
、Dictionary
など、_IEnumerable<T>
_インターフェイスを実装している任意の型でメソッドを呼び出すことができます。
実際には、JsonResult
をActionメソッドの戻り値の型として使用する理由はありません。この場合、抽象クラスActionResult
を使用して多態性原則に従うことをお勧めします。
return Json(value)
を呼び出すと、実際には次のようなControllerクラスのヘルパーメソッドを呼び出しています。
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
ご覧のとおり-Json
ヘルパーメソッドは、とにかくJsonResult
をインスタンス化します。