Вызов области ASP.NET MVC3 из веб-форм - PullRequest
2 голосов
/ 05 августа 2011

Мы находимся в процессе переноса большого приложения ASP.NET WebForms на ASP.NET MVC3 и столкнулись с небольшим затруднением, которое, мы надеемся, поможет нам.

У нас есть небольшое подмножество сайта, которое пока будет оставаться реализацией WebForms до тех пор, пока мы не сможем перенести его в MVC3, что нормально, и мы успешно гибридизировали сайт для достижения этой цели.

Однако нам необходимо иметь возможность заменить некоторые из существующих реализаций UserControl, которые мы имеем на страницах WebForms, содержимым, которое теперь должно быть сгенерировано с помощью новой реализации областей MVC3 - есть ли способ выполнить область MVC3 изнутри классическая страница веб-форм?

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Ok; кажется, что ответом будет создание частичного представления, которое вызывает необходимую область с использованием стандартного метода расширения Html.Action:

@Html.Action("Index", "Home", new { Area = "HelloWorld" })

Требуется фиктивный контроллер:

public class WebFormController : Controller { }

Затем мы можем получить ControllerContext, используя наш фиктивный элемент, и оттуда мы можем получить частичное представление и отобразить его:

public class WebFormMvcUtil
{
    public static string RenderPartial(string partialName, object model)
    {
        var httpContextWrapper = new HttpContextWrapper(HttpContext.Current);

        var routeData = new RouteData();
        routeData.Values.Add("controller", "WebFormController");

        var controllerContext = new ControllerContext(new RequestContext(httpContextWrapper, routeData),
                                                      new WebFormController());

        IView view = ViewEngines.Engines.FindPartialView(controllerContext, partialName).View;

        ViewContext viewContext;
        var stringBuilder = new StringBuilder();
        using (var stringWriter = new StringWriter(stringBuilder))
        {
            viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary {Model = model}, new TempDataDictionary(), stringWriter);
            view.Render(viewContext, viewContext.Writer);
        }

        return stringBuilder.ToString();
    }
}

Это сводится к возможности разместить простое

<%= WebFormMvcUtil.RenderPartial("_Area", null) %>

на странице веб-форм и требуемая область будет отображаться.

0 голосов
/ 05 августа 2011

Вы можете создать серверный элемент управления, который вызывает маршрут MVC-3 для получения отображаемого HTML-кода. Серверный элемент управления просто отображает полученный HTML-код. Получите из WebControl и переопределите методы Render. Образец для серверного элемента управления вы можете найти здесь .

Чтобы получить код из MVC-3, вы можете использовать объект WebRequest , что-то вроде этого:

WebRequest request = WebRequest.Create ("http://www.mypage.com/mvcroute");
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
Stream dataStream = response.GetResponseStream ();
using (StreamReader reader = new StreamReader (dataStream))
{
    string responseFromServer = reader.ReadToEnd ();
    // render response to output
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...