2010-11-22 17 views

Antwort

10

Haftungsausschluss: Die vorgeschlagene Lösung ist ein Hack.

Angenommen, Sie haben die folgenden Controller:

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

und einen entsprechenden Teil (Foo.ascx).

Und jetzt in einer alten WebForms-Seite wollten Sie diese Aktion verwenden. Gehen Sie folgendermaßen vor:

<%@ 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

Dies sollte aktualisiert werden Html.RenderAction (action, controller) oder Html.RenderPartial ("someView.ascx", Ansichtsmodell) –

+1

+1 Werke für mich in MVC3 zu verwenden, ich benötigt, um den 'controllerContext' an den' WebFormView'-Konstruktor zu übergeben, um es zu kompilieren. –

+0

Um 'RenderAction' zum Arbeiten zu bringen, führen Sie die obigen Schritte aus und ändern' TextWriter.Null' in 'Response.Output' und ändern Sie' <% = 'in' <% '. – leppie

0

Ich denke, die einfachste wäre clientseitige Skripting. Zum Beispiel mit jQuery.Load

2

Ich habe diesen Code in meiner MasterPage verwendet und es hat funktioniert. Aber nach Tagen habe ich festgestellt, dass meine Anwendung wegen Speicherlecks jede Minute neu gestartet wurde. Ich habe Tage für die Ursache gesucht und schließlich war dieser Teil des Codes die Ursache für Speicherverlust. Sie müssen DummyController und ViewPage entfernen. Ich fixiere haben es wie folgt aus:

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

     ... 
    }