Pergunta

Eu gostaria de ouvir suas opiniões e talvez melhores sugestões para o seguinte cenário:

Eu tenho definir um ActionFilter personalizado que faz algum trabalho e sai com algum valor. Gostaria de usar esse valor em ações do controlador e em modelos.

Agora, eu poderia usar TempData para passar este valor a partir do ActionFilter a qualquer método de ação do controlador, em seguida, distribuir este valor ao longo de todos os modelos que são passados ??para vistas devolvidos.

Eu tenho certeza que ele vai trabalhar, mas isso TempData vai estar lá em sessão onde e quando ninguém realmente precisa de mais. O valor é suposto ser usado exclusivamente no código durante o tempo de uma única solicitação após o que efetivamente invalida.

Eu vim com duas opções:

  1. Em ActionFilter, eu definir este valor em TempData em OnActioExecuting () e eu removê-lo em OnActionExecuted (). Eu entendi corretamente que até o momento OnActionExecuted é chamado, a ação do controlador terminar, a resposta já foi gerado e este conteúdo TempData não fez o seu caminho para a sessão AINDA?

  2. Em qualquer das minhas classes estáticas costume (lógica) eu apenas definir uma propriedade pública para este valor e eu usá-lo sempre que necessário. Será que este campo estático não se perca entre OnActionExecuting () e realmente executar o método controlador? Existem outros problemas com possível perder este valor durante o processamento do pedido no servidor?

Existem outras / melhores opções I havem't considerados ainda?

Foi útil?

Solução

Eu descobri que usando ActionParameters torna seu código muito facilmente testável. Você pode fazê-lo assim:

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

Outras dicas

re: # 2

Apenas queria salientar que o problema com um campo estático é que várias solicitações serão todos usando o mesmo campo estático. Se você tem dois pedidos executando concorrentemente há um sempre uma chance de que o pedido B irá substituir o valor pedido de A e você vai usar o valor errado quando a ação para executa solicitar um.

eu evitaria usar membros estáticos à informação hold pedido específico.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top