【问题标题】:Call ASP.NET MVC3 Area From WebForms从 WebForms 调用 ASP.NET MVC3 区域
【发布时间】:2011-08-05 08:14:27
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    需要一个虚拟控制器:

    public class WebFormController : Controller { }
    

    然后我们可以使用我们的 dummy 获取 ControllerContext,然后我们可以从那里获取 Partial View 并渲染它:

    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 页面中,将呈现所需的区域。

    【讨论】:

    • 好主意。如果将静态 RenderPartial 方法放入具有属性 Area 和 Model 的网络服务器控件中,则不再需要 aspx 页面上的丑陋代码 sn-p。
    • @Ed - 你是如何将Areas 添加到 webforms 应用程序的?我处于类似情况,任何见解都值得赞赏。
    【解决方案2】:

    您可以创建一个调用 MVC-3 路由来接收要显示的 HTML 的服务器控件。服务器控件只呈现接收到的 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
    }
    

    【讨论】:

    • 我可以创建服务器控件 - 我不清楚如何调用 MVC3 区域
    • 谢谢你,但我正在寻找一种在同一请求范围内执行该区域的方法 - 换句话说,我希望能够调用 Html.Action(...)来自 WebForms 管道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2011-08-08
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多