我正在使用一个“遗留系统”,它是一个大型 ASP.NET Web 窗体站点。该系统的一个主要扩展点是编写一个动态加载和呈现的 .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
根据这条路线,所有要被 url 模式调用的东西都{controller}.mvc
将按照 MVC 范式进行渲染。
在我的 ascx 控件中(我无法避免使用 ASCX,我必须忍受它),我正在从代码中调用我的控制器:
<%
var controller = new NamingsController(DependencyResolver.Current.GetService<InDocContext>());
var htmlToRender = controller.RenderExistingNamings();
%>
<%=htmlToRender%>
这种调用控制器的方式是错误的——我是手动创建它,而在“正常方式”中它是由控制器工厂创建的。在我的情况下,请求上下文,因此没有填充控制器上下文,并且我的控制器并不比标准逻辑类好。
在我的情况下调用控制器操作的正确方法是什么,以便它像用户通过浏览器调用它一样执行?