从WebForms调用ASP.NET MVC3区域

时间:2011-08-05 08:14:28

标签: asp.net asp.net-mvc-3

我们正在将大型ASP.NET WebForms应用程序迁移到ASP.NET MVC3,并且遇到了一个希望有人可以帮助我们的小障碍。

我们有一小部分网站将暂时作为WebForms实现保留,直到我们可以将其迁移到MVC3,这很好,我们已成功混合网站来实现这一目标。

但是,我们需要能够使用现在应该通过新的MVC3区域实现生成的内容替换我们在WebForms页面上的一些现有UserControl实现 - 有没有办法从内部执行MVC3区域一个经典的WebForms页面?

2 个答案:

答案 0 :(得分:3)

确定;答案似乎是使用标准的Html.Action扩展方法创建一个调用所需区域的局部视图:

@Html.Action("Index", "Home", new { Area = "HelloWorld" })

需要虚拟控制器:

public class WebFormController : Controller { }

然后我们可以使用我们的虚拟对象获取一个ControllerContext,从那里我们可以得到部分视图并渲染它:

public class WebFormMvcUtil
{
    public static string RenderPartial(string partialName, object model)
    {
        var httpContextWrapper = new HttpContextWrapper(HttpContext.Current);

        var routeData = new RouteData();
        routeData.Values.Add("controller", "WebFormController");

        var controllerContext = new ControllerContext(new RequestContext(httpContextWrapper, routeData),
                                                      new WebFormController());

        IView view = ViewEngines.Engines.FindPartialView(controllerContext, partialName).View;

        ViewContext viewContext;
        var stringBuilder = new StringBuilder();
        using (var stringWriter = new StringWriter(stringBuilder))
        {
            viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary {Model = model}, new TempDataDictionary(), stringWriter);
            view.Render(viewContext, viewContext.Writer);
        }

        return stringBuilder.ToString();
    }
}

这归结为能够放置一个简单的

<%= WebFormMvcUtil.RenderPartial("_Area", null) %>

在WebForms页面中,所需的区域将呈现。

答案 1 :(得分:0)

您可以创建一个服务器控件来调用MVC-3路由以接收要显示的HTML。 Server Control只是呈现收到的HTML代码。从WebControl派生并覆盖Render方法。服务器控件的示例,您可以查找here

要从MVC-3获取代码,您可以使用WebRequest对象,如下所示:

WebRequest request = WebRequest.Create ("http://www.mypage.com/mvcroute");
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
Stream dataStream = response.GetResponseStream ();
using (StreamReader reader = new StreamReader (dataStream))
{
    string responseFromServer = reader.ReadToEnd ();
    // render response to output
}