2010-11-22 20 views

答えて

10

免責事項:以下の提案された解決策はハックです。

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

と(Foo.ascx)に対応する部分:

では、次のコントローラを持っていると仮定します。

これまでのWebフォームのページで、この操作を使用したかったのです。次のように進めることができます:

<%@ 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の、コントローラ名)またはHtml.RenderPartial(「someView.ascx」、ViewModelに) –

+1

1つの作品を使用するように更新する必要があります。私はこのようにそれを修正する必要がありそれをコンパイルするために 'controllerContext'を' WebFormView'コンストラクタに渡す必要がありました。 –

+0

'RenderAction'を動作させるには、上記のステップを行い、' TextWriter.Null'を 'Response.Output'に変更し、' <%= 'を' <% 'に変更してください。 – leppie

0

クライアント側のスクリプトを使用するのが最も簡単だと思います。例:jQuery.Load

2

私はこのコードを自分の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(); 
      ... 
      ... 
     } 

     ... 
    } 
関連する問題