私はこれを行うにはさまざまな方法があると確信しています。コントローラからビューを手動でレンダリングし、JSONレスポンスの一部としてレンダリングされたビューを戻します。
これは、各エンティティの責任を保持します。ビューはまだビューエンジンを使用して配置され、再利用できます。コントローラは、その名前とモデルの種類を超えたビューについてほとんど、またはまったく分かっていません。
あなたのアクションメソッドで
public static class RenderHelper
{
public static string PartialView(Controller controller, string viewName, object model)
{
controller.ViewData.Model = model;
using(var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);
return sw.ToString();
}
}
}
レンダリングマニュアル:私は匿名型を返すよ
object model = null; // whatever you want
var obj = new {
someOtherProperty = "hello",
view = RenderHelper.PartialView(this, "_PartialName", model)
};
return Json(obj);
注意を。レンダリングされたビューの文字列プロパティを持っている限り、任意の(シリアライズ可能な)任意の型を返すことができます。手動のレンダリングを使用するアクションをテストするテスト
は若干の修正が必要です。これは、ビューをMVCパイプラインでレンダリングするよりも少し早くレンダリングするためです。
マニュアルレンダリング
- はアクションメソッド
- を入力し、明示的に<ビューをレンダリング - これは、それが困難な呼び出し元のアクション
- 終了アクションメソッド
自動をテストすることになりますレンダリング
- は、言い換えれば
(したがって、ビューをレンダリング)
出口アクションメソッド プロセスビュー結果を表示結果を作成し、アクションメソッド を入力し、私たちの手動レンダリング処理がキックオフ(ビューをコンパイルするためにビルドマネージャとやりとりするなど)テストすることを困難にするさまざまな他の操作 ビューの実際の内容ではなくアクションメソッドをテストすると仮定して、コードがホストされた環境で実行されているかどうかを確認できます。 HostingEnvironment.IsHosted
確認
public static string PartialView(Controller controller, string viewName, object model)
{
// returns false from a VS 2013 unit test, true from IIS
if(!HostingEnvironment.IsHosted)
{
// return whatever you want here
return string.Empty;
}
// continue as usual
}
(ボンネットの下に、それは単にヌルチェックある)安価です。
+1ヘルパークラスについては決して考えませんでした。これは最も洗練されたソリューションかもしれません。私はそれを試してみましょう。ありがとう。 – nthpixel
あなたはしたくないでしょう: 'var obj = new {view = RenderHelper.PartialView(this、" _PartialName "、viewModel)、model = koViewModel};'?それとも「フー」って何?または私は何かを逃していますか? – nwayve
@Dennis - はい、 "foo"は返す必要がある他のデータを表します。ノックアウトがクライアントに必要なものは正確にはわかりませんが、ビューにはモデルが必要です(ヌルであっても)。 –