문제

다음 시나리오에 대한 귀하의 의견과 더 나은 제안을 듣고 싶습니다.

나는 어떤 일을하고 어떤 가치가 나오는 사용자 정의 액션 필터를 정의했습니다. 컨트롤러 동작과 모델에서 그 값을 사용하고 싶습니다.

이제 TempData를 사용 하여이 값을 ActionFilter에서 컨트롤러 동작 메소드로 전달한 다음이 값을 반환 된 뷰로 전달되는 모든 모델에 배포 할 수 있습니다.

나는 그것이 효과가있을 것이라고 확신하지만,이 템 파다는 실제로 아무도 더 이상 필요로하지 않는시기에 세션에있을 것입니다. 값은 단일 요청 시간 동안 코드에서만 독점적으로 사용되는 후 효과적으로 무효화해야합니다.

나는 두 가지 옵션을 생각해 냈습니다.

  1. ActionFilter에서는 onactioExecuting ()에서 TempData 에서이 값을 설정하고 onactionExecuted ()에서 제거합니다. OnActionExecuted가 호출되고 컨트롤러 작업이 완료되었으며 응답이 이미 생성 되었으며이 TempData 컨텐츠가 아직 세션으로 향하지 않았다는 것을 정확하게 이해합니까?

  2. 내 커스텀 정적 클래스 (로직)에서 나는이 값에 대한 공공 속성을 정의하고 필요할 때마다 사용합니다. 이 정적 필드는 OnActionExecuting ()과 실제로 컨트롤러 메소드를 실행 사이에 손실되지 않습니까? 서버에서 요청 처리 중에이 값을 잃을 가능성이있는 다른 문제가 있습니까?

아직 고려하지 않은 다른/더 나은 옵션이 있습니까?

도움이 되었습니까?

해결책

나는 그것을 사용하는 것을 발견했다 ActionParameters 코드를 매우 쉽게 테스트 할 수 있도록합니다. 당신은 그렇게 할 수 있습니다 :

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

다른 팁

Re : #2

정적 필드의 문제는 여러 요청이 모두 동일한 정적 필드를 사용한다는 것입니다. 동시에 실행하는 두 개의 요청이있는 경우 항상 요청 B가 요청 A의 값을 덮어 쓰고 요청에 대한 조치가 실행 될 때 잘못된 값을 사용할 가능성이 있습니다.

정적 멤버를 사용하여 요청 특정 정보를 보유하지 않아도됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top