EmmployeeList 구성 요소는 모든 직원 목록을 표시합니다.
보기 버튼을 클릭하면 URL(/employeedetails/3)로 리디렉션되어야 합니다. URI의 값 3은 직원 ID입니다. blazor 구성 요소(EmployeeDetails)는 직원의 세부 정보를 표시합니다.
EmployeeDetails.razor
@page "/employeedetails/{id}"
@inherits EmployeeDetailsBase
<div class="row justify-content-center m-3">
<div class="col-sm-8">
<div class="card">
<div class="card-header">
<h1>@Employee.FirstName @Employee.LastName</h1>
</div>
<div class="card-body text-center">
<img class="card-img-top" src="@Employee.PhotoPath" />
<h4>Employee ID : @Employee.EmployeeId</h4>
<h4>Email : @Employee.Email</h4>
<h4>Department : @Employee.DepartmentId</h4>
</div>
<div class="card-footer text-center">
<a href="/" class="btn btn-primary">Back</a>
<a href="#" class="btn btn-primary">Edit</a>
<a href="#" class="btn btn-danger">Delete</a>
</div>
</div>
</div>
</div>
액세스하려면 직원 ID가 경로 매개 변수로 URL에 전달되어야 합니다. 이는 @page 지시문 경로 템플릿을 사용하여 지정됩니다.
@page "/employeedetails/{Id}"
EmployeeDetailsBase.cs
using EmployeeManagement.Models;
using EmployeeManagement.Web.Services;
using Microsoft.AspNetCore.Components;
using System.Threading.Tasks;
namespace EmployeeManagement.Web.Pages
{
public class EmployeeDetailsBase : ComponentBase
{
public Employee Employee { get; set; } = new Employee();
[Inject]
public IEmployeeService EmployeeService { get; set; }
[Parameter]
public string Id { get; set; }
protected async override Task OnInitializedAsync()
{
Id = Id ?? "1";
Employee = await EmployeeService.GetEmployee(int.Parse(Id));
}
}
}
- Id public 속성은 [ Parameter ] 속성으로 decorate됩니다 .
- 속성 이름(Id)은 @page 지시문(@page “/employeedetail/{Id}”) 의 경로 매개변수 이름과 일치합니다.
- blazor router는 URL의 경로 매개 변수 값을 사용하여 구성 요소 클래스의 Id 속성을 채웁니다.
- 라우터가 URL의 경로 매개 변수 값을 구성 요소 클래스의 공용 속성에 매핑할 수 있으려면 다음 두 가지 조건이 충족되어야 합니다.
- 컴포넌트 클래스의 공용 속성은 [Parameter] 속성으로 decorate해야 합니다.
- 구성 요소 클래스의 속성 이름과 @page 지시문의 경로 매개 변수 이름은 동일해야 합니다.
이름이 다른 경우 다음과 같은 런타임 예외가 발생합니다.
InvalidOperationException: ‘EmployeeManagement.Web.Pages.EmployeeDetail’ 유형의 개체에 ‘Id’라는 이름과 일치하는 속성이 없습니다.
Blazor optional route parameter
optional route parameter 는 지원되지 않지만 아래처럼 개의 @page 지시문을 사용하여 선택적 매개변수의 효과를 얻을 수 있습니다.
@page "/employeedetails"
@page "/employeedetails/{Id}"
첫 번째 @page 지시문을 사용하면 매개 변수 없이 구성 요소를 탐색할 수 있습니다. 두 번째 @page 지시문은 {Id} 경로 매개 변수를 수신하고 구성 요소 클래스의 Id public 속성에 값을 할당합니다.
public class EmployeeDetailsBase : ComponentBase
{
public Employee Employee { get; set; } = new Employee();
[Inject]
public IEmployeeService EmployeeService { get; set; }
[Parameter]
public string Id { get; set; }
protected override async Task OnInitializedAsync()
{
// If Id value is not supplied in the URL, use the value 1
Id = Id ?? "1";
Employee = await EmployeeService.GetEmployee(int.Parse(Id));
}
}
경로 매개변수로 URL 작성
목록 페이지에서 보기 버튼을 클릭하면 사용자를 /employeedetail/id 로 리디렉션하려고 합니다 .
<a href="@($"employeedetails/{employee.EmployeeId}")"
class="btn btn-primary m-1">View</a>
IEmployeeService.cs
public interface IEmployeeService
{
Task<IEnumerable<Employee>> GetEmployees();
Task<Employee> GetEmployee(int id);
}
EmployeeService.cs
public class EmployeeService : IEmployeeService
{
private readonly HttpClient httpClient;
public EmployeeService(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public async Task<Employee> GetEmployee(int id)
{
return await httpClient.GetJsonAsync<Employee>($"api/employees/{id}");
}
public async Task<IEnumerable<Employee>> GetEmployees()
{
return await httpClient.GetJsonAsync<Employee[]>("api/employees");
}
}