【发布时间】:2021-01-06 13:37:40
【问题描述】:
我创建了一个可重复使用的自定义 Blazor 组件来提供日+月选择器(无年份)。
我传入一个 DateTime 变量并通过组件更新它 - 好吧,我做了一个 new DateTime() 因为 DateTime 是不可变的。原始变量没有得到更新 - 这是因为我做了一个新的 DateTime() 吗?
组件
<div class="form-field">
<label class="col-form-label">@SelectName</label>
<div class="row">
<div class="col">
<InputSelect ValueExpression="@(()=>selectedDay)"
Value="@selectedDay"
ValueChanged="@((int value) => OnDayValueChanged(value))" class="form-control">
@for (int day = 1; day <= numberOfDaysInSelectedMonth; day++)
{
<option value="@day" selected="@(selectedDay==day?true:false)">@day</option>
}
</InputSelect>
</div>
<div class="col">
<InputSelect ValueExpression="@(()=>selectedMonth)"
Value="@selectedMonth"
ValueChanged="@((int value) => OnMonthValueChanged(value))" class="form-control">
@for (int month = 1; month <= 12; month++)
{
<option value="@month" selected="@(selectedMonth==month?true:false)">@Months[month-1]</option>
}
</InputSelect>
</div>
</div>
</div>
@code {
[Parameter] public DateTime SelectedDate { get; set; }
[Parameter] public string SelectName { get; set; }
private int selectedDay { get; set; }
private int selectedMonth { get; set; }
private int numberOfDaysInSelectedMonth { get; set; } = 0;
private const int year = 2001; //Not a leap year
private string[] Months = { "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August","September","Oktober","November","December"};
[Parameter] public EventCallback<DateTime> OnDateSet { get; set; }
protected override void OnInitialized()
{
selectedDay = SelectedDate.Day;
selectedMonth = SelectedDate.Month;
SetNumberOfDaysInMonth();
}
private void SetNumberOfDaysInMonth()
{
numberOfDaysInSelectedMonth = DateTime.DaysInMonth(year, selectedMonth);
}
private async Task OnDayValueChanged(int value)
{
selectedDay = value;
await SetDate();
}
private async Task OnMonthValueChanged(int value)
{
selectedMonth = value;
SetNumberOfDaysInMonth();
if(selectedDay > numberOfDaysInSelectedMonth)
{
selectedDay = numberOfDaysInSelectedMonth;
}
await SetDate();
}
private async Task SetDate()
{
SelectedDate = new DateTime(
year,
selectedMonth,
selectedDay,
0, 0, 0
);
//My fix
await OnDateSet.InvokeAsync(SelectedDate);
}
}
使用组件时我会这样做:
<DayMonthSelect SelectedDate="@serviceDescription.PlanValidFrom" SelectName="Gyldigt fra"></DayMonthSelect>
我已经使用带有新 DateTime 的 EventCallBack 创建了一个变通方法,但我不想使用此修复,因为它还需要为组件的每次使用提供一个接收函数。
[Parameter] public EventCallback<DateTime> OnDateSet { get; set; }
并添加调用回调方法
<DayMonthSelect SelectedDate="@serviceDescription.PlanValidFrom" SelectName="Gyldigt fra" OnDateSet="SetValidFromDate"></DayMonthSelect>
当输入变量在组件中得到更新时,我创建了其他共享组件。只是没有这个!
【问题讨论】:
-
你能分享更多你的代码吗?不知道你说的“好吧,我做一个新的 DateTime”是什么意思
-
我已经添加了我的完整代码
标签: c# blazor blazor-server-side