Как использовать результаты действий MVC из обычных веб-форм (подделка ControllerContext)?

StackOverflow https://stackoverflow.com/questions/1613088

Вопрос

У нас есть подключаемый фреймворк, который возвращает ActionResult объекты, которые отображают что-либо в браузере.Одно из последних требований заключается в том, что наши плагины должны вызываться из обычного приложения ASP.NET Web Forms.

До сих пор я придумывал это, которое работает для очень простых ActionResults:

public class ActionResultTranslator {

    HttpContextBase _context;

    public ActionResultTranslator(HttpContextBase context ) {

        _context = context;
    }

    public void Execute(ActionResult actionResult) {

        ControllerContext fakeContext = new ControllerContext();
        fakeContext.HttpContext = _context;            

        actionResult.ExecuteResult(fakeContext);        
    }
}

Вы бы вызвали приведенное выше из веб-формы с помощью:

protected void Page_Load(object sender, EventArgs e) {
   HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
   var translator = new ActionResultTranslator(contextWrapper);
   translator.Execute(new RedirectResult("http://google.com"));     
}

Что еще мне нужно сделать, чтобы все наладить?Например, что, если бы я захотел вернуть ViewResult?

Это было полезно?

Решение

В ControllerContext не так уж много свойств, которые можно подделать.

  • HttpContext - Ты все предусмотрел
  • Контроллер - Насколько я могу судить, никакие стандартные ActionResults не заботятся о том, оставлено ли значение null
  • RequestContext ( Запрос) - Будет заполнен автоматически, если оставить значение null
  • Маршрутизируемые данные - Будет заполнен пустой коллекцией, если оставить значение null.

Таким образом, вам остается только беспокоиться о том, что ActionResult может зависеть от присутствия произвольных ключей в RouteData.ViewResult должен быть счастливым до тех пор, пока вы заполняете Экшен и контроллер чтобы он знал, где искать файл просмотра.Если вы измените свой код, чтобы предоставить RouteData с этими значениями, все должно быть в порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top