我正在为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()未知 [原生于管理过渡]
答案 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
时,它运行正常。