簡體   English   中英

將ASP.NET MVC放入WebForms頁面

[英]Putting ASP.NET MVC into a WebForms page

有沒有辦法使用MVC助手或其他方法將asp.net MVC動作的普通視圖渲染到舊的.aspx WebForm上?

免責聲明:以下建議的解決方案是黑客攻擊。

假設您有以下控制器:

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>

我在我的MasterPage中使用了這個代碼並且它有效。 但幾天后我發現我的應用程序因為內存泄漏而每分鍾重啟一次。 我正在尋找原因和最終,這部分代碼是內存泄漏的原因。 你必須處理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();
            ...
            ...
        }

        ...
   }

我認為最簡單的方法是使用客戶端腳本。 例如,使用jQuery.Load

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM