Frage

Ich möchte Ihre Meinungen hören und vielleicht bessere Vorschläge für das folgende Szenario vor:

Ich habe einen benutzerdefinierten Actionfilter definieren, die etwas Arbeit erledigt und kommen mit einem gewissen Wert aus. Ich mag diesen Wert in Controller-Aktionen verwenden und in Modellen.

Nun, ich TempData verwenden könnte diesen Wert aus der Action zu jedem Controller-Aktion-Methode übergeben, dann verteilen Sie diesen Wert über alle Modelle, die zurück Ansichten übergeben bekommen.

Ich bin sicher, dass es funktionieren wird, aber diese TempData wird es in der Sitzung, wo und wann es niemand wirklich braucht mehr. Der Wert soll während der Zeit einer einzigen Anforderung, wonach sie wirksam entkräftet ausschließlich im Code verwendet werden.

Ich habe zwei Optionen kommen:

  1. In Action, habe ich diesen Wert in TempData in OnActioExecuting () und entferne ich es in OnActionExecuted (). Habe ich es richtig verstehe, dass OnActionExecuted durch die Zeit genannt wird, hat sich die Controller-Aktion beendet ist, hat die Antwort bereits erzeugt worden ist und diese TempData Inhalt hat seinen Weg in die Sitzung noch nicht gemacht?

  2. In jedem meiner benutzerdefinierten statischen Klassen (Logik) Ich sieht nur eine öffentliche Eigenschaft für diesen Wert und ich es verwenden, wann immer erforderlich. Wird das statische Feld nicht zwischen OnActionExecuting () und tatsächlich die Ausführung des Controller-Methode verloren? Gibt es noch andere Probleme mit möglich, diesen Wert während der Anforderungsverarbeitung auf dem Server zu verlieren?

Gibt es andere / bessere Optionen, die ich noch als havem't?

War es hilfreich?

Lösung

Ich habe festgestellt, dass ActionParameters mit Ihrem Code sehr leicht überprüfbar macht. Sie können es wie folgt:

// inside your actionfilter
public override void OnActionExecuting(ActionExecutinContext context)
{
    var someData = // ... load some data

    context.ActionParameters["someData"] = someData;
}


// and then in your action method
[ProvideSomeData]
public ViewResult Index(SomeData someData)
{
    // someData will be populated in here
}

Andere Tipps

re: # 2

Ich wollte nur darauf hinweisen, dass das Problem mit einem statischen Feld ist, dass mehrere Anfragen werden alle das gleiche statische Feld werden. Wenn Sie zwei Wünsche haben Ausführung gleichzeitig gibt es eine immer eine Chance, dass B anfordert Anfrage A den Wert überschreiben, und Sie werden den falschen Wert verwendet werden, wenn die Aktion für die Anforderung A ausführt.

würde ich mit statischen Mitglieder vermeiden bestimmte Informationen zu halten fordern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top