【问题标题】:Can I update a DateTime via a Blazor Component我可以通过 Blazor 组件更新 DateTime
【发布时间】: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


【解决方案1】:

" 但我宁愿不使用此修复程序..." 这不是修复程序。这就是这样做的方法;通过事件回调将新值传递给调用代码(父组件)......但是,您可能在单个组件中拥有所有相关代码;即父组件,不需要使用子组件(不推荐,我刚刚指出了这种可能性)。

【讨论】:

  • 补充一点-事件应该被称为 Changed (在你的情况下是SelectedDateChanged),你可以在你的组件中根据需要提出它。然后您可以在父级中进行双向绑定,例如&lt;MyDatePicker @bind-SelectedDate=@MyVar /&gt;
  • 哇——我不知道@bind-CallBackEvent 功能——它工作得很好。谢谢你..
猜你喜欢
  • 2022-01-13
  • 2021-04-17
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2018-10-17
相关资源
最近更新 更多