2010-11-22 65 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(); 
      ... 
      ... 
     } 

     ... 
    }