Pregunta

Me gustaría escuchar sus opiniones y quizás mejores sugerencias para el siguiente escenario:

He definido un ActionFilter personalizado que hace algún trabajo y sale con algún valor. Me gustaría usar ese valor en las acciones del controlador y en los modelos.

Ahora, podría usar TempData para pasar este valor del ActionFilter a cualquier método de acción del controlador, y luego distribuir este valor a todos los modelos que pasan a las vistas devueltas.

Estoy seguro de que funcionará, pero este TempData estará allí en la sesión donde y cuando ya nadie lo necesite. Se supone que el valor debe usarse exclusivamente en el código durante el tiempo de una sola solicitud, después de lo cual invalida efectivamente.

Se me ocurrieron dos opciones:

  1. En ActionFilter, configuro este valor en TempData en OnActioExecuting () y lo elimino en OnActionExecuted (). ¿Entiendo correctamente que para cuando se llama a OnActionExecuted, la acción del controlador ha finalizado, la respuesta ya se ha generado y este contenido TempData aún no ha llegado a la sesión?

  2. En cualquiera de mis clases estáticas personalizadas (lógica) simplemente defino una propiedad pública para este valor y la uso cuando sea necesario. ¿No se perderá este campo estático entre OnActionExecuting () y la ejecución real del método del controlador? ¿Hay algún otro problema con la posible pérdida de este valor durante el procesamiento de la solicitud en el servidor?

¿Hay alguna otra / mejor opción que aún no haya considerado?

¿Fue útil?

Solución

He descubierto que el uso de ActionParameters hace que su código sea fácilmente comprobable. Puedes hacerlo así:

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

Otros consejos

re: # 2

Solo quería señalar que el problema con un campo estático es que múltiples solicitudes usarán el mismo campo estático. Si tiene dos solicitudes ejecutándose simultáneamente, siempre existe la posibilidad de que la solicitud B sobrescriba el valor de la solicitud A y utilizará el valor incorrecto cuando se ejecute la acción para la solicitud A.

Evitaría usar miembros estáticos para contener información específica de la solicitud.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top