我正在使用一个大型ASP.NET Web Forms站点的“遗留系统”。该系统的主要扩展点是编写动态加载和渲染的.ascx控件。
一个网站项目引用了ASP.NET MVC 3依赖项,甚至通过将以下路由引入ASP.NET 4路由系统来为MVC的使用奠定基础:
routes.MapRoute(
"Default", // Route name
"{controller}.mvc/{action}/{pid}", // URL with parameters
new { controller = "Home", action = "Index", pid = "" } // Parameter defaults
根据这条路线,{controller}.mvc
的url模式调用的所有内容都将根据MVC范例呈现。
在我的ascx控件中(我无法避免使用ASCX,我必须忍受它),我正在通过代码调用我的控制器:
<%
var controller = new NamingsController(DependencyResolver.Current.GetService<InDocContext>());
var htmlToRender = controller.RenderExistingNamings();
%>
<%=htmlToRender%>
这种调用控制器的方式是错误的 - 我手动创建它,而在“正常方式”它是由控制器工厂创建的。在我的例子中,请求上下文,因此没有填充控制器上下文,我的控制器也不比标准逻辑类更好。
在我的情况下调用控制器操作的正确方法是什么,以便它像用户通过浏览器调用它一样执行?
答案 0 :(得分:1)
尝试以下方法:
<%
var routeData = new RouteData();
routeData.Values["controller"] = "Namings";
routeData.Values["action"] = "RenderExistingNamings";
IController controller = new NamingsController(DependencyResolver.Current.GetService<InDocContext>());
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
controller.Execute(rc);
%>
请注意,没有<%=htmlToRender%>
。输出将立即写入响应。
您应该注意Content-Type响应标头,该标头现在是控制器操作设置的内容类型,而不是WebForm设置的内容类型。如果两者都是text/html
,则应该是一个问题。
答案 1 :(得分:0)
您是否尝试过使用Html.RenderAction()
?
http://msdn.microsoft.com/en-us/library/system.web.mvc.html.childactionextensions.renderaction.aspx