Domanda

Mi piacerebbe sentire le tue opinioni e forse suggerimenti migliori per il seguente scenario:

Ho definito un ActionFilter personalizzato che fa un po 'di lavoro ed esce con un certo valore. Vorrei usare quel valore nelle azioni del controller e nei modelli.

Ora, potrei usare TempData per passare questo valore da ActionFilter a qualsiasi metodo di azione del controller, quindi distribuire questo valore su tutti i modelli che vengono passati alle viste restituite.

Sono sicuro che funzionerà ma questo TempData sarà lì nella sessione in cui e quando nessuno ne ha più bisogno. Si suppone che il valore venga utilizzato esclusivamente nel codice durante il periodo di una singola richiesta dopo la quale viene effettivamente invalidato.

Ho trovato due opzioni:

  1. In ActionFilter, ho impostato questo valore in TempData in OnActioExecuting () e lo rimuovo in OnActionExecuted (). Comprendo correttamente che quando viene chiamato OnActionExecuted, l'azione del controller è terminata, la risposta è già stata generata e questo contenuto TempData non è arrivato alla sessione ANCORA?

  2. In una qualsiasi delle mie classi statiche personalizzate (logica) definisco solo una proprietà pubblica per questo valore e la utilizzo ogni volta che è necessario. Questo campo statico non andrà perso tra OnActionExecuting () e l'esecuzione effettiva del metodo del controller? Ci sono altri problemi con la possibile perdita di questo valore durante l'elaborazione della richiesta sul server?

Ci sono altre / migliori opzioni che non ho ancora preso in considerazione?

È stato utile?

Soluzione

Ho scoperto che l'uso di ActionParameters rende il tuo codice molto facilmente testabile. Puoi farlo in questo modo:

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

Altri suggerimenti

re: # 2

Volevo solo sottolineare che il problema con un campo statico è che più richieste useranno tutte lo stesso campo statico. Se hai due richieste in esecuzione contemporaneamente c'è sempre la possibilità che la richiesta B sovrascriva il valore della richiesta A e utilizzerai il valore errato quando viene eseguita l'azione per la richiesta A.

Eviterei di usare membri statici per contenere informazioni specifiche sulla richiesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top