2016-08-20 9 views
0

開発中、私はしばしばこのようなコントローラメソッドを記述します。そのため、モデルの内容が適切に設定され、ビューの開発を助けることができます。パラメータに基づいてASP.NET MVCコントローラのアクションからJSONを返します

public ActionResult SomeMethod(int id, bool asJson = false) 
{ 
    var model = SomeBackendService.GetModel(id); 
    if(asJson) 
     return Json(model, JsonRequestBehavior.AllowGet); 
    return View(model); 
} 

ビューの開発が完了したら変更しますが、後でJSONとして結果を得ることができたらと思っています。

理想的には、コントローラーメソッドを各コントローラーの各メソッドを記録せずにJSONとして要求できるようにするWeb.configキーを設定したいと考えています。私は、特定のクエリ文字列パラメータで要求されたときにJSONとしてモデルを返す次のメソッドを望みます。

public ActionResult SomeMethod(int id) 
{ 
    var model = SomeBackendService.GetModel(id); 
    return View(model); 
} 

私は自分のビューエンジンを実装することが必要な道のりを推測していますが、それが正しいかどうかはわかりません。

+2

(確かに、このアプローチは、私は並べ替えを取得する方法についての提案を開いてよ...適切なヘッダを追加しません)と 'asJson'移動しますそこに論理。あなたのコントローラーをベースコントローラーから継承させると、そのコントローラーに能力があります。アクションフィルタには別のオプションがあり、ビュー結果からモデルを抽出してjson結果を返すことができます。 – Nkosi

+0

これは単なる開発のためのものであれば、モデルデータをhtmlでレンダリングするヘルパーを開発(または見つけて)、その下のどこかのビューに配置し、web.configのスイッチをオフまたはオンにすることができます。代わりに、モデル集団を専用のメソッドに移動し、モデルアクションをjsonとして返すコントローラアクションを追加することもできます。または、JSONデータを一切見ず、代わりにモデル集団の単体テストを作成してください。 –

答えて

0

実際、私はカスタムDisplayModeProviderを使ってこれを行う方法を考え出しました。

JSONをレンダリングするビューを使用することだけが本当に必要なことです。

public class JsonOnlyDisplayProvider : DefaultDisplayMode 
{ 
    public JsonOnlyDisplayProvider(string suffix) : base(suffix) { }   

    protected override string TransformPath(string virtualPath, string suffix) 
    { 
     return "~/Views/Shared/JsonOnly.cshtml"; 
    } 
} 

は、その後、私はのAppSettingとクエリ文字列パラメータを評価ContextConditionで新しいプロバイダを挿入するためのGlobal.asaxで Application_Start方法を変更:だから私はTransformPathメソッドをオーバーライドするカスタムDisplayProviderを作成しました。

最後のステップは、JSONを吐き出す一般的なビューを作成することでした。ベースコントローラを作成しますJsonOnly.cshtml

@{ 
    Layout = null; 
    if (Model != null) 
    { 
     @Html.Raw(Json.Encode(Model)) 
    } 
} 
関連する問題