2016-06-27 5 views
0

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()

+0

完全なスタックトレースとは何ですか?私はこれが正しいアプローチであるとは確信できません。子アクションは通常、文字列に書き込むのではなく、同じレスポンスストリームで子リクエストをトリガーすることで動作します。 –

+0

@AntP質問にスタックトレースが追加されました。 Razorビューで 'HtmlHelper.RenderAction()'を呼び出すと、ストリームに書き込みますが、 'HtmlHelper.Action()'を呼び出すと 'ToString()'を呼び出すことができる 'MvcString'を返します。 – Entith

+0

この質問を投稿して以来、私は 'HtmlHelper'のインスタンスを作成し、その' Action() 'メソッドを使用してこれを達成しようとしています。これは、私がテストでどのようにしたいか正確に機能しました。問題は、Edge.jsを使用してNodeJSコードを実行していて、自分の 'HandleActionHelper()'メソッド(NodeJSコードが呼び出す)で 'HtmlHelper.Action()'を呼び出すと、 'Action ) 'メソッドは返されず、エラーや例外はありません。私はこれを修正することがこの質問の話題にはならないと思います。私はまだ私がやろうとしていることをするためのより適切な方法があるかどうかを知りたいと思う。 – Entith

答えて

0

不明 [管理への移行ネイティブ]だから、これまで私の解決策は、あなたがかみそりで取得HtmlHelperクラスのインスタンスを作成することでしたその後、ビュー、および結果の文字列を取得するためにそのAction()メソッドを使用します。

using System.Web.Mvc; // Bring in HtmlHelper 
using System.Web.Mvc.Html; // Bring in HtmlHelper's extension methods. 
... 
var html = new HtmlHelper(viewContext, new ViewPage()); 
string actionResults = html.Action("ActionName", "ControllerName"); 

注1:これは、カスタム・ビュー・エンジンのカスタムIView実装内にあるので、私はちょうどViewContext instancに渡さ私はすでに持っていた。利用可能なViewContextがない場合は、作成する必要があります。ここでは(それがどのように動作するかもそれほどわからない)古い例であるが、それはあなたが始めるのに役立つはずです。Create HtmlHelper instance in Controller

注2:私の元の質問のコメントで述べたように、私は、このアプローチで問題を抱えていました。私が知る限り、HtmlHelperは非同期のコンテキストでうまく動作しません。私はEdge.jsを使ってNodeJSコードを呼び出していましたが、これはすべて非同期のものなので、これがこれらの問題の原因だと思います。 Edge.jsの外にHtmlHelperへのコールを移動すると、正常に機能しました。

関連する問題