2010-09-07 93 views
4

在同一个解决方案中,我们已经有了旧的ASP.NET窗体页面和新的MVC视图和局部视图。网站上的一些页面是MVC,而传统页面是表单。ASP.NET MVC:在ASP.NET Forms中包含MVC局部视图页面

其中一个遗留的Forms页面是.ascx控件。有没有什么办法让我在这个Forms .ascx控件中插入一个MVC局部视图(.ascx)?

回答

2

我使用这种技术嵌入MVC谐音成web表单页面。不知道它是否可以在webforms用户控件中使用,但应该可以。

第1步。在应用程序的MVC部分中,创建以下帮助函数。这确实所有的辛勤工作:在您的网页

namespace MvcApplication 
{ 
    // create a dummy controller 
    public class DummyController : Controller 
    { 
    } 

    public static class MvcPartialHelper 
    { 
     public static void RenderPartial(string partialViewName, object model) 
     { 
      ControllerContext controllerContext; 
      HttpContextBase httpContextBase; 
      IView view; 
      RouteData routeData; 
      ViewContext viewContext; 

      httpContextBase = new HttpContextWrapper(HttpContext.Current); 
      routeData = new RouteData(); 
      routeData.Values.Add("controller", typeof(DummyController).Name); 
      controllerContext = new ControllerContext(new RequestContext(httpContextBase, routeData), new DummyController()); 
      view = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName).View; 
      viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextBase.Response.Output); 
      view.Render(viewContext, httpContextBase.Response.Output); 
     } 
    } 
} 

然后,(或用户控件):

添加以下引用上面:

<%@ Import Namespace="MvcApplication" %> 

,然后当你需要以显示部分你可以添加类似的东西:

<% MvcPartialHelper.RenderPartial("~/views/shared/TestPartial.ascx", "hello - this is my model"); %> 

其中第二个参数是你的'莫德尔”。

我在混合MVC/Webforms环境中广泛使用这种技术,它像梦一样工作!

享受

0

没有,是不是因为你没有执行此插入所需的HTML辅助:

<%= Html.RenderPartial("foo") %> 

而且你的MVC部分是强类型(是不是),你赢了无法访问模型。

另外,当您将旧版webforms应用程序迁移到ASP.NET MVC时,它应该是相反的。

+0

我不能仅仅只包含的HtmlHelper的命名空间? – foobarbarfoo 2010-09-07 21:54:26

+0

'Html'是'System.Web.ViewPage'的一个属性,所以命名空间的包含*技巧*仅在您编写扩展HtmlHelper的自定义帮助程序时才有效,但是这假设您已经有了对它的引用,而不是这种情况在一个类web表单中。 – 2010-09-07 21:56:15

0

从技术上讲,尽管你需要跳过一些箍环来实现你所要求的,但也有可能。您需要创建一个虚拟控制器上下文,查看上下文和相关环境,然后在代码后面的页面中创建一个属性以模拟模型。

让我知道,如果你想详细说明/例子

+0

是的,你有链接可以指向我吗?漂亮请:) – foobarbarfoo 2010-09-07 23:44:45