Как использовать результаты действий MVC из обычных веб-форм (подделка ControllerContext)?
-
06-07-2019 - |
Вопрос
У нас есть подключаемый фреймворк, который возвращает 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 с этими значениями, все должно быть в порядке.