I am Working On A Blazor 8 Project . I am Unable get the Courses (on the basis of Specialization Id) In Course Select Element and also As With @bind cannot use @onChange Event Together
HandleSpecilaizationOnChangeEvent Not Getting Called in this way. but With @onchange it is working..
below Is the Code Please Help.
Child Component
<section>
<div class="row">
<div class="col-4">
<label>Name</label>
<input class="form-control" type="text" @bind="Model.Name" />
</div>
<div class="col-4">
<label>Gender</label>
<select class="form-control" @bind="Model.Gender">
<option value="0">Select</option>
@foreach (var gender in Genders)
{
<option value="@gender">@gender</option>
}
</select>
</div>
<div class="col-4">
<label>Age</label>
<input class="form-control" type="number" @bind="Model.Age" />
</div>
<div class="col-4">
<label>Contact No</label>
<input class="form-control" type="text" @bind="Model.ContactNo" />
</div>
<div class="col-4">
<label>Specialization </label>
<select class="form-control" @bind="Model.Specialisation">
<option value="0">Select</option>
@foreach (var Specialization in Specializations)
{
<option value="@Specialization.Key">@Specialization.Value</option>
}
</select>
</div>
<div class="col-4">
<label>Course</label>
<select class="form-control" @bind="Model.Course">
<option value="0">Select</option>
@if (Courses != null)
{
@foreach (var course in Courses)
{
<option value="@course.Key">@course.Value</option>
}
}
</select>
</div>
</div>
@if (Id == null)
{
<div class="row mt-5">
<div class="col-6">
<button type="submit" @onclick="HandleSave" class="btn btn-outline-primary">Save</button>
</div>
</div>
}
else
{
<div class="row mt-5">
<div class="col-6">
<button type="submit" class="btn btn-outline-warning">Update</button>
</div>
</div>
}
</section>
@code {
[Parameter] public StudentModel Model { get; set; } = new StudentModel();
[Parameter] public string? Id { get; set; }
[Parameter] public List<string> Genders { get; set; } = [];
[Parameter] public Dictionary<int, string> Specializations { get; set; } = [];
[Parameter] public Dictionary<int, string> Courses { get; set; } = [];
[Parameter] public EventCallback OnSpecialisationChangeEvent { get; set; }
[Parameter] public EventCallback OnHandleSave{ get; set; }
public async Task HandleSpecilaizationOnChangeEvent(ChangeEventArgs value)
{
Model.Specialisation =value!.ToString()!;
await OnSpecialisationChangeEvent.InvokeAsync(Model.Specialisation);
}
public async Task HandleSave()
{
await OnHandleSave.InvokeAsync();
}
}
Parent Component
@page "/Add"
@page "/Add/{Id}"
@using BlazorApp1.Models
@using BlazorApp1.Services
@rendermode InteractiveServer
@inject IStudentService service
<section class="container">
@if (Id == null)
{
<span>Add Student Record</span>
}
else
{
<span>Edit Student Record</span>
}
<UserForm Model="StudentModel" Id="@Id" Genders="@Genders"
Specializations="@Specializations" OnSpecialisationChangeEvent="@HandleSpecializationChangeEvent"
Courses="@Courses" OnHandleSave="@HandleValidSubmit" />
</section>
@code {
[Parameter] public string? Id { get; set; }
private StudentModel StudentModel { get; set; } = new StudentModel();
private List<string> Genders = [];
private Dictionary<int, string> Specializations = [];
private Dictionary<int, string> Courses = [];
protected override async Task OnInitializedAsync()
{
Genders = await service.GetGenders();
Specializations = await service.GetSpecialisations();
if (Id is not null)
{
StudentModel = await service.FetchStudentDetails(int.Parse(Id));
await HandleSpecializationChangeEvent(Id);
}
}
private async Task HandleSpecializationChangeEvent(Object e)
{
if (e is ChangeEventArgs changeEventArgs)
{
string selectedValue = changeEventArgs.Value?.ToString()!;
if (!string.IsNullOrEmpty(selectedValue))
{
if (int.TryParse(selectedValue, out int SpecializationId))
{
if (SpecializationId != 0)
{
Courses = await service.GetCourses(SpecializationId);
}
else
{
Courses.Clear();
}
}
}
}
else
{
Courses = await service.GetCourses(int.Parse(e.ToString()!));
}
}
private async Task HandleValidSubmit()
{
var res = await service.SaveCourseDetails(StudentModel);
}
}
public class StudentModel
{
public int Id { get; set; }
[Required] public string Name { get; set; } = string.Empty;
[Required] public int Age { get; set; }
[Required] public int ContactNo { get; set; }
[Required] public string Gender { get; set; } = "0";
[Required] public string Specialisation { get; set; } = "0";
[Required] public string Course { get; set; } = "0";
}
there are two scenarios Direct Add(Problem) and Edit Mode (Working Fine)
On Direct Mode , When I change the Specialization , its relevant data Should be Populated On Course Select List..
also I My OnInitializedAsync Methods Runs Two Times .
Please Help.