在ASP.NET Forms页面中包含MVC部分视图

4

我们有一些旧的ASP.NET Forms页面和新的MVC视图和部分视图在同一个解决方案中。网站上的某些页面是MVC,而遗留页面是Forms。其中一个遗留的Forms页面是一个.ascx控件。

我是否有办法将MVC部分视图(.ascx)插入到这个Forms .ascx控件中?

3个回答

2

我使用这种技术将MVC部分嵌入到Webforms页面中。不确定它是否适用于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"); %>

第二个参数是您的“Model”。

我在混合 MVC/Webforms 环境中广泛使用此技术,效果非常好!

祝愉快!


0

不,没有,因为您没有所需的Html助手来执行此插入操作:

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

此外,您的MVC部分是强类型的(不是吗),您将无法访问模型。

另外,当您将传统的WebForms应用程序迁移到ASP.NET MVC时,应该反过来做。


我能不能只包含HtmlHelper的命名空间? - foobarbarfoo
“Html” 是属于 System.Web.ViewPage 的一个属性,因此命名空间的引入技巧只是当您编写自定义助手来扩展 HtmlHelper 时使用的,但是这假定您已经有对它的引用,在 Class Web Form 中不是这种情况。 - Darin Dimitrov

0

从技术上讲,这是可能的,但你需要绕过一些障碍才能实现你所要求的。你需要创建一个虚拟控制器环境、视图环境和相关环境,然后在你页面的后端代码中创建一个属性来模拟模型。

如果你需要详细的说明或示例,请告诉我。


是的,你有可以给我指向的链接吗?拜托了 :) - foobarbarfoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接