[TIPS, MVC] Отрисовка MVC элементов в не MVC страницах
От: mogadanez Чехия  
Дата: 29.08.09 16:33
Оценка: 111 (4)
Дано: большой и толстый продукт на класическом ASP.NET
Задача: новый код писать на MVC, постепенно переписывая старый по мере возможности
Проблема: странички почти все очень разбиты на мелкие составляющие и не научившись вызывать одно из другого трудно решить задачу постепенной переписки

Решение: (для варианта когда из старого класического ASP.NET вызывается новый MVC )


public static class ControllerExtensions
        {
        public static HtmlHelper CreateHtmlHelper( this HttpContext context )
            {
            var request_context = new RequestContext( new HttpContextWrapper( context), new RouteData() );
            var controller_context = new ControllerContext( request_context, new StubController );

            var dictionary = new ViewDataDictionary();
            var wrapper = new ViewWrapper( dictionary );
            var viewContext = new ViewContext( controller_context, wrapper, dictionary, new TempDataDictionary() );
            return new HtmlHelper( viewContext, wrapper );
            }

        public static UrlHelper CreateUrlHelper( this HttpContext context )
            {
            return new UrlHelper( new RequestContext( new HttpContextWrapper( context ), new RouteData() ) );
            }
        }

    internal class StubController : Controller
        {
        }

    internal class ViewWrapper : IView, IViewDataContainer
        {
        public ViewWrapper( ViewDataDictionary dictionary )
            {
            ViewData = dictionary;
            }

        #region IView Members

        public void Render( ViewContext viewContext, TextWriter writer )
            {
            }

        #endregion

        #region IViewDataContainer Members

        public ViewDataDictionary ViewData { get; set; }

        #endregion
        }


использование:


//можно поместить в код базового класса если есть такой
protected HtmlHelper Html;

public void OnLoad(...)
    {
    Html =HttpContext.Current.CreateHtmlHelper();
    }




<% Html.RenderAction<PartsController>( c =>c.some_action( "some action args" ) ); %>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.