В настоящее время я пишу проект с использованием Blazor Server (.net 7.0).
Итак, если у меня есть модель с несколькими датами и временем? свойства на нем, я хочу создать кнопку рядом с целым рядом полей даты и времени, чтобы вставить текущую дату и время, которые вызывают метод и обновляют свойство с текущей датой и временем.
Вместо создания метода для каждой кнопки, например
<button @Onclick = "@UpdateNowOn_DateReceived"></Button>
<button @Onclick = "@UpdateNowOn_InitialContact"></Button>
protected void UpdateNowOn_DateReceived()
{
Model.Details.DateReceived = DateTime.Now;
StateHasChanged();
}
protected void UpdateNowOn_InitialContact()
{
Model.Details.InitialContact = DateTime.Now;
StateHasChanged();
}
Я надеялся, что смогу написать метод, который мог бы просто передать свойство в обновление его значения. Я очень новичок в Blazor и С#, поэтому все это для меня совершенно ново (учусь по ходу дела).
Так что я надеялся, что можно сделать это более похоже на это
<button @Onclick = "@UpdateNowOn(Model.Details.DateReceived)"></Button>
<button @Onclick = "@UpdateNowOn(Model.Details.InitialContact)"></Button>
protected void UpdateNowOn(DateTime property?) <-- what to pass here
{
Property = DateTime.Now;
StateHasChanged();
}
Любая помощь приветствуется
Я пытался прочитать и использовать следующее, но я не уверен, что мне нужно:
Хотя я уверен, что есть более простой способ (который сейчас ускользает от меня), вы можете сделать это с помощью рефлексии. Добавьте второй параметр в метод, который принимает имя свойства (которое вы можете передать из разметки с помощью nameof
), а затем используйте отражение, чтобы получить дескриптор этого свойства. Немного грязно, но сработает.
Привет, спасибо за ваш ответ. Хотя, если быть честным, здесь может проявиться отсутствие у меня основ, я уже слышал, как размышления бросали раньше, но я понятия не имею, как этим воспользоваться. Затем я погуглю в «nameof», чтобы узнать, смогу ли я найти ответ, но в настоящее время я не уверен, как построить/закодировать ваш ответ.
В зависимости от причины, по которой вам это нужно, вы можете сделать следующее: <button @onclick = "() => {@Model.Details.DateReceived = DateTime.Now;}"></button>
Вам не нужно передавать свойство во что-либо. Вы думаете, что кнопка не управляет вводом.
Создайте компонент, реализующий стандартную платформу привязки Blazor.
Вот пример, который, я думаю, соответствует вашим требованиям.
<button disabled = "@_isSet" @attributes=this.AdditionalAttributes @onclick=this.OnChange>@this.Text</button>
@code {
[Parameter] public DateTime? Value { get; set; }
[Parameter] public EventCallback<DateTime?> ValueChanged { get; set; }
[Parameter(CaptureUnmatchedValues = true)] public IReadOnlyDictionary<string, object>? AdditionalAttributes { get; set; }
[Parameter, EditorRequired] public string? Text { get; set; } = "Not Set";
[Parameter] public bool DisableIfSet { get; set; } = false;
private bool _isSet => this.DisableIfSet && this.Value is not null;
private async Task OnChange()
=> await this.ValueChanged.InvokeAsync(DateTime.Now);
}
А затем в использовании:
@page "/"
<PageTitle>Index</PageTitle>
<ButtonComponent class = "btn btn-primary" Text = "Log Received" @bind-Value=_selectedValue1 DisableIfSet=true />
<div class = "alert alert-info m-3 p-2">@(_selectedValue1.ToString() ?? "Not Set")</div>
<ButtonComponent class = "btn btn-success" Text = "Set Initial Contact Date" @bind-Value=_selectedValue2 />
<div class = "alert alert-info m-3 p-2">@(_selectedValue2.ToString() ?? "Not Set")</div>
@code {
private DateTime? _selectedValue1;
private DateTime? _selectedValue2;
}
Спасибо всем за ваши ответы. Я серьезно задумался об этом, и размещение встроенной функции сработало в этом случае, как это было предложено thewallrus
Я просто добавил событие onclick к кнопке следующим образом
<button @onclick = "() => {@Model.Details.DateReceived = DateTime.Now;}
Привет, спасибо за ваш ответ, я пробовал, но получаю сообщение об ошибке: «CS0206 Свойство или индексатор не может быть передано как параметр вывода или ссылки».