ASP.NET MVC用のカスタムビューエンジンを作成しています。私は子のアクションのサポートを追加しようとしています。以下は、子アクションを実行して結果を文字列として返すハンドラです。この時点まですべてが正しく機能しています。メソッドが必要なときに呼び出され、パラメータがすべて正しく読み込まれます。ASP MVC - 手動で子アクションを実行する
private string HandleActionHelper(ViewContext viewContext, string actionName, string controllerName, RouteValueDictionary routeValues)
{
var routeData = new RouteData();
if (string.IsNullOrEmpty(controllerName))
controllerName = viewContext.RouteData.Values["controller"] as string;
routeData.Values["action"] = actionName;
routeData.Values["controller"] = controllerName;
foreach(var value in routeValues)
{
routeData.Values.Add(value.Key, value.Value);
}
var requestContext = new RequestContext(viewContext.HttpContext, routeData);
var mvcHandler = new MvcHandler(requestContext);
StringWriter writer = new StringWriter();
viewContext.HttpContext.Server.Execute(mvcHandler, writer, true);
return writer.GetStringBuilder().ToString();
}
それは、viewContext.HttpContext.Server.Execute(mvcHandler, writer, true);
にSystem.Web.HttpException
をスローします。
完全なエラーメッセージが読み:ハンドラの子要求を実行
エラー 'System.Web.Mvc.MvcHandler'。
私はオンラインで検索し、どのように確認するためにMVCのソースを見て、これはちょうど/ internal
MVCクラスの多くを貼り付けるコピーせずにそれで私の最高の刺したしてきました。
子のアクションを実行して結果を文字列として戻すにはどうすればよいですか?
編集:!フルスタックトレースを追加
のSystem.Web.dll System.Web.HttpServerUtility.ExecuteInternal(System.Web.IHttpHandler ハンドラ、たSystem.IO.TextWriterライター、BOOL preserveForm、 BOOL setPreviousPage、System.Web.VirtualPathパス、System.Web.VirtualPath filePathに、文字列physPath、のSystem.Exceptionエラー、文字列 queryStringOverride)不明 のSystem.Web.dll!System.Web.HttpServerUtility.Execute(System.Webの.IHttpHandler ハンドラ、System.IO.TextWriterライター、b (System.Web.IHttpHandler setPreviousPage)不明 System.Web.dll!System.Web.HttpServerUtility.Execute .Web.HttpServerUtilityWrapper.Execute(System.Web.IHttpHandler ハンドラ、たSystem.IO.TextWriterライター、BOOL preserveForm)不明 JadeViewEngine.dll!JadeViewEngine.JadeView.HandleActionHelper(System.Web.Mvc.ViewContext viewContext、文字列actionNameの、文字列のコントローラ名、 System.Web.Routing.RouteValueDictionary routeValues)ライン85 C# JadeViewEngine.dll!JadeViewEngine.JadeView.Render.AnonymousMethod__0(ダイナミック 入力)ライン39のC#edge_nativeclr.node!ClrFunc.Call(値、ペイロード、未知の[管理への移行ネイティブ] コールバック)不明 edge_nativeclr.node!.clrFuncProxy(Nan.FunctionCallbackInfo * 情報)
edge_nativeclr.node [ネイティブ 移行への管理対象]!.Nan.imp。?A0x8dda69af.FunctionCallbackWrapper (v8.FunctionCallbackInfo * 情報)未知の[管理への移行ネイティブ]
edge_nativeclr.node!NodejsFuncInvokeContext.CallFuncOnV8Thread()不明 edge_nativeclr.node [ネイティブ 移行への管理対象]!.clrActionContext.ActionCallback(void *型 データ)不明[ネイティブから管理された移行] [ネイティブから管理] 移行]
edge_nativeclr.node!.continueOnV8Thread(uv_async_s *ハンドル、 intステータス)不明[ネイティブから管理された移行] [ネイティブから管理] 移行] EdgeJs.dll!EdgeJs.Edge.Func。AnonymousMethod__1()不明 がmscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context不明(オブジェクト 状態) がmscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext のExecutionContext、System.Threading.ContextCallbackコールバック、オブジェクト 状態、ブール値preserveSyncCtx)不明 がmscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext のExecutionContext、System.Threading.ContextCallbackコールバック、オブジェクト 状態、ブール値preserveSyncCtx)不明 がmscorlib.dll!システム.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallbackコールバック、オブジェクト 状態)不明 がmscorlib.dll!System.Threading.ThreadHelper.ThreadStart()
完全なスタックトレースとは何ですか?私はこれが正しいアプローチであるとは確信できません。子アクションは通常、文字列に書き込むのではなく、同じレスポンスストリームで子リクエストをトリガーすることで動作します。 –
@AntP質問にスタックトレースが追加されました。 Razorビューで 'HtmlHelper.RenderAction()'を呼び出すと、ストリームに書き込みますが、 'HtmlHelper.Action()'を呼び出すと 'ToString()'を呼び出すことができる 'MvcString'を返します。 – Entith
この質問を投稿して以来、私は 'HtmlHelper'のインスタンスを作成し、その' Action() 'メソッドを使用してこれを達成しようとしています。これは、私がテストでどのようにしたいか正確に機能しました。問題は、Edge.jsを使用してNodeJSコードを実行していて、自分の 'HandleActionHelper()'メソッド(NodeJSコードが呼び出す)で 'HtmlHelper.Action()'を呼び出すと、 'Action ) 'メソッドは返されず、エラーや例外はありません。私はこれを修正することがこの質問の話題にはならないと思います。私はまだ私がやろうとしていることをするためのより適切な方法があるかどうかを知りたいと思う。 – Entith