¿Cómo usar los resultados de acción de MVC de los formularios web normales (simulando ControllerContext)?
-
06-07-2019 - |
Pregunta
Tenemos un marco conectable que devuelve objetos ActionResult
que renderizan las cosas a un navegador. Un requisito de última hora es que nuestros complementos deben ser invocables desde una aplicación regular de formularios web de ASP.NET.
Hasta ahora he encontrado esto, que funciona para ActionResults muy básicos:
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);
}
}
Llamaría a lo anterior desde un formulario web con:
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"));
}
¿Qué más necesito hacer para conectar todo? Por ejemplo, ¿qué sucede si deseo devolver un resultado de vista?
Solución
No hay demasiadas propiedades para falsificar en ControllerContext.
- HttpContext : tienes esto cubierto
- Controlador : por lo que puedo decir, a los ActionResults estándar no les importa si esto queda nulo
- RequestContext : se rellenará automáticamente si se deja nulo
- RouteData : se rellenará con una colección vacía si se deja en blanco.
Así que solo tiene que preocuparse de que ActionResult pueda depender de la presencia de claves arbitrarias en RouteData. Un ViewResult debe estar contento siempre que rellene acción y controlador para que sepa dónde buscar el archivo de vista. Si modifica su código para proporcionar un RouteData con esos valores, debería estar bien.