2009-06-01 13 views
5

I asked a question früher heute über ActionFilters in ASP.Net MVC. Es stellte sich heraus, mein Problem war wirklich, dass meine ActionFilter nicht einmal läuft. Unter anderem lese ich this article, und ich kann nichts finden, was er tut, was ich nicht tue.Warum läuft keiner meiner ActionFilter?

Dies ist mein Code:

// The ActionFilter itself 
public class TestingIfItWorksAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.TempData["filter"] = "it worked!"; 
     base.OnActionExecuting(filterContext); 
    } 
} 

// The Controller Action with the filter applied 
[TestingIfItWorks] 
public ActionResult Test() 
{ 
    var didit = TempData["filter"]; 
    return View(); 
} 

Ein Haltepunkt in der Filtermethode wird nie getroffen, wenn ich debuggen und TempData["filter"] hält einen null Wert, wenn die Ansicht gerendert wird.

Warum funktioniert das nicht?

Antwort

4

Basierend auf Ihre Kommentare zu einer anderen Antwort

Wenn über Unit-Tests testen, wird der Filter nicht aufgerufen. Wenn Sie den Filter aufrufen möchten, müssen Sie den ControllerActionInvoker nachahmen. Es ist wahrscheinlich besser, den Filter selbst isoliert zu testen und dann mithilfe der Reflektion sicherzustellen, dass der Filter mit den korrekten Attributen auf Ihre Aktion angewendet wird. Ich bevorzuge diesen Mechanismus gegenüber dem Testen des Filters und der Aktion in Kombination.

Original-

Sicherlich benötigen Sie einen override auf Ihre Methode sonst sind Sie nicht eigentlich die Methode auf der Basisklasse zu ersetzen. Ich hätte erwartet, dass der Compiler sich beschweren würde, dass Sie entwederoder override benötigen. Wenn Sie das Schlüsselwort override nicht einschließen, verhält es sich so, als ob Sie new verwendet hätten. Da das Framework es als ActionFilterAttribute aufruft, bedeutet dies, dass Ihre Methode niemals aufgerufen wird.

Zitiert von MSDN:

Wenn die Methode in der abgeleiteten Klasse ist nicht durch neue voran- oder Schlüsselwörter außer Kraft setzen, gibt die Compiler eine Warnung und das Verfahren wird als verhalten, wenn das neue Schlüsselwort waren anwesend.

+0

Hm ... seltsam, dass es dort nicht hineinkam. Ich habe keine Warnung erhalten (bis ich neu kompilierte), aber das Überschreiben hat die Situation nicht verändert: Der Code läuft immer noch nicht. –

+0

Haben Sie eine Wiederherstellungslösung erstellt?Vielleicht ist eine Bibliothek veraltet. Ich kann mir nicht vorstellen, dass dies nicht funktioniert, wenn Sie override verwenden. – tvanfosson

+0

tat ich. Kein Glück ... = ( –

0

Zusätzlich zu dem, was tvanofosson sagte, ist Ihre Aktionsmethode nicht wirklich etwas auf die Ansicht gerendert. Hat Ihre Ansicht eine <%=TempData["Filter"].ToString()%> Aussage oder etwas Ähnliches?

+0

Nein, ich habe eigentlich keine Aussicht . Ich habe einen Haltepunkt in der ActionResult-Methode im Controller und einen Haltepunkt in der OnActionExecuting-Methode im Filter und einen UnitTest, der die Aktion aufruft. Ich habe "Debug-Test" und stoppe in der Controller-Aktion, aber nicht in der Filteraktion. Außerdem versucht der Komponententest, TempData ["filter"] == "es hat funktioniert!" Zu bestätigen und schlägt fehl. –

+0

Aha - das Attribut wird nicht aus dem Komponententest aufgerufen, es wird nur vom MVC-Framework aufgerufen, wenn die Methode vom action executor aufgerufen wird. – tvanfosson

4

Im Fall ist es hilfreich für jeden mit MVC 4/5:

ActionFilters wenn Sie den Namensraum Ihres ActionFilterAttribute oder IActionFilter falsch nicht laufen: https://stackoverflow.com/a/13710468/188926

Verwenden System.Web.Http.Filters für Web-API, System.Web.Mvc für Standard-MVC-Aktionen.

Wie in der Frage, das Filter-Attribut wird einfach ignoriert (kein Fehler), wenn Sie es falsch bekommen, was es schwierig zu diagnostizieren macht.