6

J'aimerais entendre vos opinions et peut-être de meilleures suggestions pour le scénario suivant:ASP.NET MVC, ActionFilters, classes statiques et les données qui passent autour

Je définir un ActionFilter personnalisé qui fait un peu de travail et sort avec une certaine valeur. Je voudrais utiliser cette valeur dans les actions du contrôleur et dans les modèles.

Maintenant, je pourrais utiliser TempData passer cette valeur de la ActionFilter à toute méthode d'action du contrôleur, distribuer cette valeur sur tous les modèles qui sont transmis à des vues renvoyées.

Je suis sûr que cela fonctionnera, mais ce TempData sera là en session où et quand personne n'a besoin en fait plus. La valeur est censée être utilisée exclusivement dans le code au moment d'une demande unique, après quoi elle est effectivement invalidée.

Je suis venu avec deux options:

  1. En ActionFilter, je définir cette valeur dans TempData dans OnActioExecuting() et je l'enlever dans OnActionExecuted(). Est-ce que je comprends bien 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'est pas passé à la session YET?

  2. je définis seulement dans une de mes classes personnalisées statiques (logiques) une propriété publique pour cette valeur et je l'utilise en cas de besoin. 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 pendant le traitement de la requête sur le serveur?

Y at-il d'autres options que je/meilleures havem't jugeais encore?

Répondre

8

J'ai trouvé que l'utilisation ActionParameters rend votre code très facilement testables. Vous pouvez le faire comme ceci:

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

en fait assez intéressant. Est-ce que les paramètres du constructeur d'action seront automatiquement mappés aux clés de collection ActionParameters? – User

+0

Oui, les paramètres d'action doivent être la méthode préférée pour transmettre la valeur dans le contrôleur. – kazimanzurrashid

+0

Finalement, j'ai aimé cette approche, même si elle nie définitivement le principe DRY. Merci pour le conseil. – User

3

re: # 2

Je voulais juste signaler que le problème avec un champ statique est que plusieurs demandes seront tous utilisent le même champ statique. Si vous avez deux requêtes s'exécutant simultanément, il y a toujours un risque que la requête B écrase la valeur de la requête A et que vous utilisiez la mauvaise valeur lorsque l'action de la requête A est exécutée.

J'éviter d'utiliser des membres statiques pour tenir demander des informations spécifiques.

+0

Merci. J'avais peur de quelque chose comme ça. Ainsi, ces champs statiques sont partagés entre toutes les demandes et chaque demande n'a-t-elle pas son propre contexte? – User

+2

Les champs et les propriétés statiques publics sont visibles pour chaque thread de l'application. – OdeToCode

Questions connexes