2009-02-03 14 views
13

Ho un ActionFilter che controlla se un parametro nell'URL è valido. Se non è valido devo rendere una vista. Non voglio reindirizzare, perché ho ancora bisogno di ActionExecutingContext. Può essere fatto?Return View from ActionFilter

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Guid processIdentifier = (Guid)filterContext.RouteData.Values["processIdentifier"]; 
     //if processIdentifier not found render a view with message and some other objects in ViewData 
     filterContext.Controller.ViewData.ModelState.AddModelError("WrongProcessIdentifier", "The process-id you supplied is not valid"); 
     base.OnActionExecuting(filterContext); 
    } 

risposta

31

HandleErrorAttribute aveva quello che stavo cercando.

filterContext.Result = new ViewResult 
      { 
       ViewName = "MessagePage", 
       ViewData = filterContext.Controller.ViewData, 
       TempData = filterContext.Controller.TempData 
      }; 
+0

Penso che dovresti accettare la tua risposta perché include il codice –

+1

Per qualsiasi cosa valga la pena, non ho intenzionalmente incluso il codice, dal momento che quest'area di codice sta cambiando con ogni versione del framework MVC al momento. Penso che la risposta corretta sia "fai tutto ciò che il framework sta facendo attualmente". –

1

Sì. Guarda la fonte di HandleErrorAttribute.

0

Prova questa

[HandleError] 
public ActionResult MyAction (int id) 
{ 
    // ... 
} 

e mettere la vista che si desidera reso in a ~/Views/Shared/Error.ascx.

+0

I filtri come [HandleError] si applicano solo ai metodi di azione. Il metodo OnActionExecuting() è esso stesso un filtro piuttosto che un metodo di azione, quindi attributi come questo non hanno alcun effetto. – Levi

+0

Scusa, non ho nemmeno guardato il metodo. Ho aggiornato. –

Problemi correlati