あるプログラムがコントローラーコンテキストにまったくいなくてもビューを利用できるようにしたい、または他のプログラムを呼び出さずにコントローラー内からビューを文字列にレンダリングできるようにしたいということですか?コントローラ?
前者の場合、私はあまり役に立ちませんが、後者の場合、他のすべてのコントローラーで継承する基本コントローラータイプにこのメソッドがあります。
/// <summary>
/// Generates a string based on the given PartialViewResult.
/// </summary>
/// <param name="partialViewResult"></param>
/// <returns></returns>
protected internal string RenderPartialViewToString(ViewResultBase partialViewResult)
{
Require.ThatArgument(partialViewResult != null);
var context = ControllerContext;
Require.That(context != null);
using (var sw = new StringWriter())
{
if (string.IsNullOrEmpty(partialViewResult.ViewName))
{
partialViewResult.ViewName = context.RouteData.GetRequiredString("action");
}
ViewEngineResult result;
if (partialViewResult.View == null)
{
result = partialViewResult.ViewEngineCollection.FindPartialView(context, partialViewResult.ViewName);
Require.That(result.View != null,
() => new InvalidOperationException(
"Unable to find view. Searched in: " +
string.Join(",", result.SearchedLocations)));
partialViewResult.View = result.View;
}
var view = partialViewResult.View;
var viewContext = new ViewContext(context, view, partialViewResult.ViewData,
partialViewResult.TempData, sw);
view.Render(viewContext, sw);
return sw.ToString();
}
}
使用法:
public ActionResult MyAction(...)
{
var myModel = GetMyModel(...);
string viewString = RenderPartialViewToString(PartialView("MyView", myModel));
// do something with the string
return someAction;
}
実際には、これをイベントベースのAJAXモデルで使用します。このモデルでは、ほとんどのアクションが実際にはAJAXでエンコードされたクライアント側イベントのリストを返します。これらのクライアント側イベントの一部は、特定のDOM要素を文字列で更新する場合があります。この部分ビューをレンダリングすることによって生成されます。