Дано: большой и толстый продукт на класическом 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" ) ); %>