Question

J'aimerais connaître vos opinions et peut-être de meilleures suggestions pour le scénario suivant:

J'ai défini un ActionFilter personnalisé qui effectue un travail et génère une valeur. J'aimerais utiliser cette valeur dans les actions du contrôleur et dans les modèles.

Maintenant, je pourrais utiliser TempData pour transmettre cette valeur d'ActionFilter à n'importe quelle méthode d'action du contrôleur, puis distribuer cette valeur sur tous les modèles transmis aux vues renvoyées.

Je suis sûr que cela fonctionnera, mais ce TempData sera là en session où et quand personne n'en aura plus besoin. La valeur est supposée être utilisée exclusivement dans le code pendant le temps d’une seule requête, après quoi elle est invalidée.

J'ai proposé deux options:

  1. Dans ActionFilter, j'ai défini cette valeur dans TempData dans OnActioExecuting () et je l'ai supprimée dans OnActionExecuted (). Dois-je bien comprendre qu’au moment où OnActionExecuted est appelé, l’action du contrôleur est terminée, la réponse a déjà été générée et ce contenu TempData n’a pas encore été acheminé vers la session?

  2. Dans n'importe laquelle de mes classes statiques personnalisées (logique), je viens de définir une propriété publique pour cette valeur et je l'utilise chaque fois que nécessaire. Ce champ statique ne sera-t-il pas perdu entre OnActionExecuting () et l'exécution de la méthode du contrôleur? Y a-t-il d'autres problèmes avec la possibilité de perdre cette valeur lors du traitement de la demande sur le serveur?

Existe-t-il d'autres options / meilleures que je n'ai pas encore envisagées?

Était-ce utile?

La solution

J'ai constaté que l'utilisation de ActionParameters rend votre code très facilement testable. Vous pouvez le faire comme suit:

// 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
}

Autres conseils

re: # 2

Je voulais seulement souligner que le problème avec un champ statique est que plusieurs demandes utiliseront toutes le même champ statique. Si vous avez deux demandes qui s'exécutent simultanément, il est toujours possible que la demande B écrase la valeur de la demande A et vous utiliserez une valeur incorrecte lors de l'exécution de l'action de la demande A.

J'éviterais d'utiliser des membres statiques pour conserver des informations spécifiques à une demande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top