Ввод ASP.NET MVC на страницу WebForms

Есть ли способ визуализировать обычный вид действия MVC asp.net на старый .aspx WebForm с помощью помощника MVC или какого-либо другого метода?

Ответ 1

Отказ от ответственности: предлагаемое решение ниже - взлом.

Предположим, что у вас есть следующий контроллер:

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

Я использовал этот код в своем 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();
            ...
            ...
        }

        ...
   }

Ответ 3

Я думаю, что проще всего использовать скрипты на стороне клиента. Например, используя jQuery.Load