¿Cómo usar los resultados de acción de MVC de los formularios web normales (simulando ControllerContext)?

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

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top