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

У нас есть подключаемый фреймворк, который возвращает 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?

1 Ответ

1 голос
/ 24 октября 2009

В ControllerContext не так уж много свойств для подделки.

  • HttpContext - у вас есть это покрыто
  • Контроллер - Насколько я могу судить, ни один стандартный ActionResults не заботится, если оставить значение пустым
  • RequestContext - Заполняется автоматически, если оставить пустым
  • RouteData - будет заполнен пустой коллекцией, если оставить ноль.

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

...