2

我正在使用一个“遗留系统”,它是一个大型 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%>

这种调用控制器的方式是错误的——我是手动创建它,而在“正常方式”中它是由控制器工厂创建的。在我的情况下,请求上下文,因此没有填充控制器上下文,并且我的控制器并不比标准逻辑类好。

在我的情况下调用控制器操作的正确方法是什么,以便它像用户通过浏览器调用它一样执行?

4

2 回答 2

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,那应该是个问题。

于 2012-07-15T07:40:10.420 回答
0

您是否尝试过使用Html.RenderAction()

http://msdn.microsoft.com/en-us/library/system.web.mvc.html.childactionextensions.renderaction.aspx

于 2012-07-14T23:51:46.397 回答