この質問 から受け入れられた回答を使用しようとしています。
まさに探しているようですが問題があります。実際にそれを呼び出す方法がわかりません。これは私がこれまでに持っているものです:
最初に、私が言及したソリューションからコードをコピーしています:
public string ToHtml(string viewToRender, ViewDataDictionary viewData, ControllerContext controllerContext)
{
var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);
StringWriter output;
using (output = new StringWriter())
{
var viewContext = new ViewContext(controllerContext, result.View, viewData, controllerContext.Controller.TempData, output);
result.View.Render(viewContext, output);
result.ViewEngine.ReleaseView(controllerContext, result.View);
}
return output.ToString();
}
これは私が持っているものです:
string viewToRender = "...";
int Data1 = ...;
int Data2 = ...;
System.Web.Mvc.ViewDataDictionary viewData = new System.Web.Mvc.ViewDataDictionary();
viewData.Add("Data1",Data1);
viewData.Add("Data2",Data2);
string html = ToHtml(viewToRender, viewData, ?????)//Here is my problem.
ControllerContextパラメータには何を渡すべきですか?
明らかにコントローラーを拡張する基本コントローラーを作成し、基本コントローラーで上記の関数を使用できます。この基本コントローラーを拡張する他のコントローラーは、それを使用できます。ただし、ControllerContextは次のように使用する必要があります。
Request.RequestContext
したがって、BaseControllerは次のようになります。
public class BaseController: Controller
{
//your function here
}
そしてあなたのToHtml()関数は
protected virtual string ToHtml(string viewToRender, ViewDataDictionary viewData )
{
var controllerContext=Request.RequestContext;
var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);
StringWriter output;
using (output = new StringWriter())
{
var viewContext = new ViewContext(controllerContext, result.View, viewData, controllerContext.Controller.TempData, output);
result.View.Render(viewContext, output);
result.ViewEngine.ReleaseView(controllerContext, result.View);
}
return output.ToString();
}
そして、ベースコントローラを使用して
public class MyController: BaseController
{
//ToHtml(...);
}
Controller
を継承するのではなく、これを毎回実装することを忘れないでください。または、CustomControllerBase
から継承する必要があります。つまり、毎回継承することを忘れないでください。拡張メソッドを作成するだけです。
public static class ControllerExtensions
{
public static string RenderView(this Controller controller, string viewName, object model)
{
return RenderView(controller, viewName, new ViewDataDictionary(model));
}
public static string RenderView(this Controller controller, string viewName, ViewDataDictionary viewData)
{
var controllerContext = controller.ControllerContext;
var viewResult = ViewEngines.Engines.FindView(controllerContext, viewName, null);
StringWriter stringWriter;
using (stringWriter = new StringWriter())
{
var viewContext = new ViewContext(
controllerContext,
viewResult.View,
viewData,
controllerContext.Controller.TempData,
stringWriter);
viewResult.View.Render(viewContext, stringWriter);
viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View);
}
return stringWriter.ToString();
}
}
次に、Controller
内で次のように呼び出すことができます。
this.RenderView("ViewName", model);
これは、強い型付けと部分ビューを生成する機能を備えたモデルがあることを除いて、ほぼ dav_iの投稿 のコピーです。
Controller
を継承するのではなく、これを毎回実装することを忘れないでください。または、CustomControllerBase
から継承する必要があります。つまり、毎回継承することを忘れないでください。拡張メソッドを作成するだけです。
public static class ControllerExtensions
{
public static string RenderView<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
{
var controllerContext = controller.ControllerContext;
controllerContext.Controller.ViewData.Model = model;
// To be or not to be (partial)
var viewResult = partial ? ViewEngines.Engines.FindPartialView(controllerContext, viewName) : ViewEngines.Engines.FindView(controllerContext, viewName, null);
StringWriter stringWriter;
using (stringWriter = new StringWriter())
{
var viewContext = new ViewContext(
controllerContext,
viewResult.View,
controllerContext.Controller.ViewData,
controllerContext.Controller.TempData,
stringWriter);
viewResult.View.Render(viewContext, stringWriter);
viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View);
}
return stringWriter.ToString();
}
}
次に、Controller
内で次のように呼び出すことができます(全体図)。
this.RenderView("ViewName", model);
つまり、doctypeやHTML要素なども取得できます。部分ビューの使用:
this.RenderView("ViewName", model, true);