카테고리 없음

blazor에서 router 를 통해 cascadingvalue 로 선언한값을 controller 에서 사용하는 방법

keisoft 2024. 9. 23. 07:46

Blazor에서 CascadingValue로 선언한 값을 컨트롤러에서 사용하는 것은 직접적으로 할 수 없습니다. CascadingValue는 Blazor 컴포넌트 트리 내에서 데이터를 전달하는 메커니즘이기 때문입니다. 하지만 이 값을 컨트롤러에서 사용할 수 있도록 하는 몇 가지 방법이 있습니다:

1. 상태 관리 서비스 사용:
   - 애플리케이션 상태를 관리하는 서비스를 만들고, 이를 의존성 주입(DI)을 통해 컨트롤러와 Blazor 컴포넌트에서 공유할 수 있습니다.

2. HttpContext.Items 사용:
   - Blazor Server의 경우, 미들웨어에서 HttpContext.Items에 값을 저장하고 컨트롤러에서 이를 읽을 수 있습니다.

3. 쿠키나 로컬 스토리지 사용:
   - 클라이언트 측에서 값을 저장하고, 필요할 때 API 요청에 포함시켜 컨트롤러로 전달할 수 있습니다.

이 중 가장 일반적이고 권장되는 방법은 상태 관리 서비스를 사용하는 것입니다. 간단한 예제 코드를 보여드리겠습니다:

```csharp
// StateService.cs
public class StateService
{
    public string SomeValue { get; set; }
}

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<StateService>();
    // 다른 서비스 등록...
}

// _Host.cshtml 또는 App.razor
@inject StateService StateService

<CascadingValue Value="@StateService.SomeValue">
    <Router AppAssembly="@typeof(Program).Assembly">
        <!-- 라우팅 설정 -->
    </Router>
</CascadingValue>

// SomeComponent.razor
@inject StateService StateService

<button @onclick="UpdateValue">Update Value</button>

@code {
    private void UpdateValue()
    {
        StateService.SomeValue = "New Value";
    }
}

// SomeController.cs
[ApiController]
[Route("[controller]")]
public class SomeController : ControllerBase
{
    private readonly StateService _stateService;

    public SomeController(StateService stateService)
    {
        _stateService = stateService;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var value = _stateService.SomeValue;
        return Ok(value);
    }
}
```

이 접근 방식을 사용하면 `StateService`를 통해 Blazor 컴포넌트와 컨트롤러 간에 상태를 공유할 수 있습니다. `CascadingValue`는 `StateService.SomeValue`를 사용하여 값을 전파하고, 컨트롤러에서도 같은 `StateService`를 주입받아 값에 접근할 수 있습니다.

이 방법이 도움이 되셨나요? 추가 설명이나 다른 방법에 대해 더 알고 싶으시다면 말씀해 주세요.