2010-11-22 100 views

回答

10

免責聲明:下面提出的解決方案是一種黑客攻擊。

假設有下列的控制器:

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

這應該是更新MVC3使用Html.RenderAction(actionName,controllerName)或Html.RenderPartial( 「someView.ascx」,視圖模型) – 2011-02-21 03:06:06

+1

+1對我的作品,我需要將'controllerContext'傳遞給'WebFormView'構造函數來讓它編譯。 – 2011-07-25 14:55:17

+0

要使'RenderAction'工作,請執行上述步驟,並將'TextWriter.Null'改爲'Response.Output'並將'<%='改爲'<%'。 – leppie 2017-01-16 14:17:09

0

我認爲最簡單的就是使用客戶端腳本。例如使用jQuery.Load

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(); 
      ... 
      ... 
     } 

     ... 
    }