从ASCX调用MVC控制器的操作<%code%>

时间:2012-07-14 23:42:48

标签: asp.net asp.net-mvc controller ascx

我正在使用一个大型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%>

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

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

2 个答案:

答案 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)