简而言之,它是您的 Invoke() 方法! Razor 引擎通过写入内存流来工作,然后将其解析为响应。您获得该行为的原因是您的 Invoke() 方法直接写入响应流;即在解析内存流之前。
我在使用 Html.RenderAction() 时遇到了类似的行为,它指向返回 PartialView 的操作。解决方法是使用 Html.Action()。不同之处在于 Action() 返回一个字符串,该字符串附加到内存流中,而 RenderAction() 直接写入响应。
如果您发布您的 Invoke() 方法的代码,我也许可以进一步帮助您!
| -- 编辑 -- |
好的,事实证明这比最初预期的要复杂。问题是我无法让 ProcessRequest() 附加到当前响应;不过,我可能有一个解决方案。
public string ProcessRoute(ViewContext viewContext, RouteData routeData)
{
var urlHelper = new UrlHelper(viewContext.RequestContext);
var currentUrl = urlHelper.Action(routeData.Values["action"].ToString(),
routeData.Values["controller"].ToString(), routeData.DataTokens);
var stringWriter = new StringWriter();
var simpleWorkerRequest = new SimpleWorkerRequest(currentUrl, "", stringWriter);
var context = new HttpContext(simpleWorkerRequest);
var contextBase = new HttpContextWrapper(context);
var requestContext = new RequestContext(contextBase, routeData);
var httpHandler = routeData.RouteHandler.GetHttpHandler(requestContext);
httpHandler.ProcessRequest(context);
context.Response.End();
stringWriter.Flush();
return stringWriter.GetStringBuilder().ToString();
}
上面的代码生成了一个新的请求,并将请求的 HTML 作为字符串返回。通过这样做,结果将作为当前响应的一部分附加。您现在可以重写您的 Invoke() 函数以返回一个字符串,该字符串可以显示在您的视图上。
public string Invoke(ViewContext viewContext)
{
if (_mvcHandler == null)
{
var routeData = new RouteData(context.RouteData.Route,
context.RouteData.RouteHandler);
routeData.Values.Add("id", _id);
routeData.Values.Add("moduleName", _moduleName);
routeData.Values.Add("controller", _controllerName);
routeData.Values.Add("action", _actionName);
routeData.Values.Add("pageContext", _pageContext);
if (!string.IsNullOrEmpty(_preferredNamespace))
{
routeData.DataTokens.Add("Namespaces", new[] { _preferredNamespace });
}
return ProcessRoute(viewContext, routeData);
}
return string.Empty;
}
你可能还需要改变;
mr.Invoke(ViewContext);
到;
Html.Raw(mr.Invoke(ViewContext));
为了停止 HTML 编码行为。
| -- 注意 -- |
由于我没有您的 ModuleRequests 类,因此我无法专门针对您的场景测试此代码。相反,我尽可能地复制了这个问题并解决了它。
如果您有任何问题,请告诉我。
马特