将ASP.NET MVC应用程序嵌入WebForms页面

10

有没有办法使用MVC助手或其他方法,将ASP.NET MVC操作的普通视图呈现在旧的.aspx WebForm上?

3个回答

11

免责声明:以下提出的解决方案是一种hack。

假设你有以下控制器:

public class HomeController : Controller
{
    [ChildActionOnly]
    public ActionResult Foo()
    {
        return View();
    }
}

还有相应的部分文件 (Foo.ascx)。

如果你想在一个传统的WebForms页面中使用这个操作,以下是如何进行的:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<script type="text/C#" runat="server">
    private class DummyController : Controller { }

    public HtmlHelper Html { get; private set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var httpContext = new HttpContextWrapper(Context);
        var controllerContext = new ControllerContext(
            httpContext, 
            new RouteData(), 
            new DummyController()
        );
        var viewContext = new ViewContext(
            controllerContext, 
            new WebFormView("Views"), 
            new ViewDataDictionary(), 
            new TempDataDictionary(), 
            TextWriter.Null
        );
        Html = new HtmlHelper(viewContext, new ViewPage());  
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= Html.Action("About", "Home") %>
    </div>
    </form>
</body>
</html>

2
这个应该更新为使用Html.RenderAction(actionName, controllerName)或者Html.RenderPartial("someView.ascx", viewModel)。 - Eric Falsken
1
对我有用,在MVC3中,我需要将“controllerContext”传递给“WebFormView”构造函数才能使其编译。 - Marnix van Valen
要让RenderAction正常工作,请按照上述步骤操作,并将TextWriter.Null更改为Response.Output,并将<%=更改为<% - leppie

2

我在我的主页面中使用了这段代码,它可以正常工作。但是几天后,我发现我的应用程序由于内存泄漏而每分钟重新启动一次。我花了几天时间来寻找原因,最终发现这段代码是内存泄漏的原因。你需要处理 DummyController 和 ViewPage。我已经像这样修复了它:

 public class BaseMaster :  System.Web.UI.MasterPage
 {

#region MVC
    Controller _controller= new DummyController();
    ViewPage _viewPage = new ViewPage();

    private class DummyController : Controller { }

    public HtmlHelper Html { get; private set; }

    private void InitHtmlHelper()
    {          
        var httpContext = new HttpContextWrapper(Context);
        var controllerContext = new ControllerContext(
            httpContext,
            new RouteData(),
            _controller
        );
        var viewContext = new ViewContext(
            controllerContext,
            new WebFormView(controllerContext,"Views"),
            new ViewDataDictionary(),
            new TempDataDictionary(),
            TextWriter.Null
        );
        Html = new HtmlHelper(viewContext, _viewPage);  
    }


    public override void Dispose()
    {
        base.Dispose();

        _controller.Dispose();
        _viewPage.Dispose();
    }

#endregion


        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            InitHtmlHelper();
            ...
            ...
        }

        ...
   }

0

我认为最简单的方法是使用客户端脚本。例如,使用 jQuery.Load


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