Короче говоря, это ваш метод Invoke ()!Механизм бритвы работает, записывая в поток в памяти, а затем анализирует его в ответ.Причина, по которой вы получаете такое поведение, заключается в том, что ваш метод 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, я не смог протестировать этот код специально для вашего сценария.Вместо этого я воспроизвел проблему как можно лучше и решил ее.
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.
Matt