Размещение ASP.NET MVC на странице веб-форм - PullRequest
10 голосов
/ 22 ноября 2010

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

Ответы [ 3 ]

11 голосов
/ 22 ноября 2010

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

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

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 голосов
/ 06 января 2013

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

        ...
   }
0 голосов
/ 22 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...