2010-08-25 12 views
7

que tratar de devolver un método de reemplazo ViewResult en OnActionExecutedActionFilterAttribute de claseASP.NET MVC ViewResult

, como a continuación ...

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    if (CreateCookie && filterContext.Exception == null) 
    { 
     LoginCookies lcookie = new LoginCookies(usuDs, usuSenha); 
     lcookie.WriteCookie("SCE", 10); 
    } 
    else 
    { 
     filterContext.Result = new ViewResult() { ViewName = "Login" }; 
     filterContext.Result.ExecuteResult 
       (filterContext.Controller.ControllerContext); 
    } 

Funciona bien para volver a una vista llamada "Login" , pero necesito pasar el objeto modelo a esta vista (en este caso, el objeto modelo es el tipo de usuarios) y no sé cómo pasarlo usando la clase ViewResult directamente.

¿Alguna idea?

Actualizado: he resuelto mi configuración de filterContext.ExceptionHandled TRUE problema, pero el principal problema no se solucionó, no se puede establecer la propiedad de ModelView, siempre es nula.

+0

Por favor, muestre el código que * no * funciona. – bzlm

+0

El código es anterior. Cuando devuelvo el acceso de ViewResult en el código anterior, también necesito pasar el modelo a Ver, de lo contrario ver arroja una excepción porque el modelo es nulo. Problema: no puedo configurar el modelo para esta vista. – ozsenegal

Respuesta

2

Puedo estar equivocado, pero creo que los datos de la vista forman parte de la base del controlador y no forman parte de la vista en sí. Por lo tanto, debería poder establecer los datos de vista de esta manera:

filterContext.Controller.ViewData.Model = <your view model> 

Acabo de probar y esto funcionó para mí. No veo ninguna razón por la que no debe trabajar para usted:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     TestClass1 viewModel = new TestClass1(); 

     viewModel.FirstName = "TestFilter"; 

     filterContext.Controller.ViewData.Model = viewModel; 
    } 

Referencing documentation

+0

wow, pensé que funcionaba, pero no, ese modelo siempre es nulo en la vista – ozsenegal

+0

@ozsenegal En el ejemplo, estás en el evento OnActionExecuted, pero ¿estás seguro de que estás en el código actual? Tus datos de vista deberían estar accesibles en este punto. – joshlrogers

+0

sí, estoy seguro. Ver los datos es accesible de la manera que se muestra, pero en la vista la propiedad del modelo mantiene nulo – ozsenegal

1

Tal vez esto va a funcionar para usted:

filterContext.Result = new ViewResult { ViewName = "Exception", ViewData = new ViewDataDictionary(new CmsExceptionViewData(filterContext.Exception, action, controllerName, errorMessage)) }; 

Así que la ViewData se crea con un ViewDataDictionary que acepta un diccionario o un modelo.

9

Me encontré con el mismo problema por el que mi modelo que se pasa a la vista siempre era NULL. Pude pasar el Modelo a mi vista con lo siguiente:

Crea tu viewModel y establece las propiedades. Cree un nuevo ViewResult que le dé el nombre de su Vista y luego pase su viewModel a ViewData.

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 

    TestViewModel viewModel = new TestViewModel; 

    //Here set all the properties of your viewModel such as your exception message 

    filterContext.Controller.ViewData.Model = viewModel; 
    filterContext.Result = new ViewResult { ViewName = "Login", ViewData = new ViewDataDictionary(viewModel)}; 
    filterContext.ExceptionHandled = true; 

}