Как добавить страницы .aspx в существующий проект MVC 4?

У меня работает ASP.NET MVC 4. Я хочу добавить к этому проекту MVC 2 .aspx страницы другого проекта WebForms. У меня есть несколько вопросов:

  • Где я должен копировать эти файлы .aspx и как мне настроить мою маршруты?
  • Как мне рассказать этим страницам .aspx использовать ~/Shared/_Layout.chtml как главную страницу?
  • Кроме того, эти .aspx-страницы используют .ascx-элементы управления. Где я должен хранить их?
  • Как мне изменить файл web.config?

Я просмотрел ссылки в этом, но они, похоже, устарели. Многие ссылки объясняют, как добавить MVC в WebForms, но я ищу все вокруг.

Любые полезные ссылки будут оценены. Спасибо!

Ответ 1

Решение:

Как оказалось, добавление страниц .aspx в существующий проект MVC - это еще более простая задача, чем добавление mvc в .aspx. Самое интересное для меня было выяснить, что и веб-формы, и MVC в рамках одного проекта разделяют среду одна на IIS.

Итак, что я сделал:

  • Добавлены страницы .aspx из другого проекта в root моего проекта MVC
  • Создана новая главная страница для моих веб-форм страниц (щелкните правой кнопкой мыши project- > add- > new item- > Master Page)
  • Чтобы сделать Мастер-страницу WF и _Layout.chtml из MVC, поделитесь одним и тем же Мастером 'Вид, я обнаружил эта замечательная статья, которая позволяет вам называть что-то похожее на метод @Html.RenderPartial() на странице .aspx
  • В следующем коде представлена ​​информация о том, как реализовать метод RenderPartial в WebForms:

    public class WebFormController : Controller { }
    
    public static class WebFormMVCUtil
    {
    
        public static void RenderPartial( string partialName, object model )
        {
            //get a wrapper for the legacy WebForm context
            var httpCtx = new HttpContextWrapper( System.Web.HttpContext.Current );
    
            //create a mock route that points to the empty controller
            var rt = new RouteData();
            rt.Values.Add( "controller", "WebFormController" );
    
            //create a controller context for the route and http context
            var ctx = new ControllerContext( 
            new RequestContext( httpCtx, rt ), new WebFormController() );
    
            //find the partial view using the viewengine
            var view = ViewEngines.Engines.FindPartialView( ctx, partialName ).View;
    
            //create a view context and assign the model
            var vctx = new ViewContext( ctx, view, 
                new ViewDataDictionary { Model = model }, 
                new TempDataDictionary() );
    
            //render the partial view
            view.Render( vctx, System.Web.HttpContext.Current.Response.Output );
        }
    
    }
    

    Добавьте его на codebehind.cs вашей страницы .aspx. Затем вы можете вызвать его из веб-форм следующим образом:

    <% WebFormMVCUtil.RenderPartial( "ViewName", this.GetModel() ); %>
    
  • Так как у меня было только "меню", которое было распространено среди всех моих страниц, я добавил его в частичный вид, а затем вызвал его в _Layout.chtml

    @Html.Partial("_Menu")
    

и MasterPage.Master:

    <% WebFormMVCUtil.RenderPartial("_Menu", null ); %>

Вот и все. В результате мои _Layout.chtml и MasterPage.Master используют одни и те же общие частичные представления. И я могу использовать страницы .aspx, просто перемещаясь по ним. Если у вас есть проблемы с системой маршрутизации, вы можете добавить routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); в свой маршрутConfig в App_Start.

Источники, которые я использовал:

Я надеюсь, что это поможет кому-то позже.