ASP MVC - 手动执行子操作

时间:2016-06-27 17:11:34

标签: asp.net-mvc asp.net-mvc-5

我正在为ASP.NET MVC编写自定义视图引擎。我正在尝试添加对子操作的支持。下面是应该执行子操作并将结果作为字符串返回的处理程序。到目前为止,一切都正常工作;该方法应该被调用,并且所有参数都被正确填充。

endvalue

它会在>>> genSeries(11, 16) [(11, 12), (11, 12, 13), (11, 12, 13, 14), (11, 12, 13, 14, 15), (11, 12, 13, 14, 15, 16)] 上抛出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(); }

完整的错误消息显示为:

  

执行处理程序'System.Web.Mvc.MvcHandler'的子请求时出错。

我一直在网上搜索并查看MVC来源,看看如何,这是我最好的方法,而不是复制/粘贴很多System.Web.HttpException MVC类。

如何执行子操作并将结果作为字符串返回?

修改:添加完整堆栈跟踪

  

System.Web.dll中!System.Web.HttpServerUtility.ExecuteInternal(System.Web.IHttpHandler   handler,System.IO.TextWriter writer,bool preserveForm,bool   setPreviousPage,System.Web.VirtualPath path,System.Web.VirtualPath   filePath,字符串physPath,System.Exception错误,字符串   queryStringOverride)未知   System.Web.dll中!System.Web.HttpServerUtility.Execute(System.Web.IHttpHandler   handler,System.IO.TextWriter writer,bool preserveForm,bool   setPreviousPage)未知   System.Web.dll中!System.Web.HttpServerUtility.Execute(System.Web.IHttpHandler   handler,System.IO.TextWriter writer,bool preserveForm)未知   System.Web.dll中!System.Web.HttpServerUtilityWrapper.Execute(System.Web.IHttpHandler   handler,System.IO.TextWriter writer,bool preserveForm)未知   JadeViewEngine.dll!JadeViewEngine.JadeView.HandleActionHelper(System.Web.Mvc.ViewContext   viewContext,string actionName,string controllerName,   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 *   info)未知[本机到托管转换] [管理到本机   过渡]
  edge_nativeclr.node!.Nan.imp?A0x8dda69af.FunctionCallbackWrapper(v8.FunctionCallbackInfo *   info)未知[本机到托管转换] [管理到本机   过渡]
  edge_nativeclr.node!NodejsFuncInvokeContext.CallFuncOnV8Thread()未知   edge_nativeclr.node!.clrActionContext.ActionCallback(无效*   数据)未知[本机到托管转换] [管理到本机   过渡]
  edge_nativeclr.node!.continueOnV8Thread(uv_async_s * handle,   int status)未知[本机到托管转换] [管理到本机   转换] 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回调,对象   state,bool preserveSyncCtx)未知   mscorlib.dll中!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext   executionContext,System.Threading.ContextCallback回调,对象   state,bool preserveSyncCtx)未知   mscorlib.dll中!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext   executionContext,System.Threading.ContextCallback回调,对象   国家)未知   mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()未知   [原生于管理过渡]

1 个答案:

答案 0 :(得分:0)

所以我的解决方案是创建Razor视图中获得的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实例。如果您没有ViewContext可用,则必须创建一个。{1}}。这是一个旧的例子(所以不确定它的工作情况),但它应该可以帮助你开始:Create HtmlHelper instance in Controller

注2:正如我原来问题的评论中所提到的,我遇到了这种方法的问题。据我所知,HtmlHelper在异步上下文中不能很好地工作。我使用Edge.js来调用NodeJS代码,这是所有异步的东西,所以我认为这是这些问题的原因。当我将调用移到Edge.js之外的HtmlHelper时,它运行正常。