Я ищу способ неявной передачи параметров из родительского компонента в дочерний компонент.Позвольте мне объяснить: я кодировал Компонент с именем InputValidation, чтобы проверить входные данные (связанные Свойством) с условием, которое мы можем установить.
Вчера я спросил сообщество StackOverflow, как получить ссылки (сначала по Reflection) на каждый дочерний компонент.Тема здесь => Blazor получает вложенные компоненты с помощью Reflection
Кстати, еще раз спасибо вкладчику, который помог мне.
Теперь я хочу вложить еще один компонент chid в это InputValidation.Вот так:
<InputValidation ref="@InputValidationRef" Property="@lang.Value">
<ValidationCase TItem="string" On="@(x => !string.IsNullOrEmpty(x))" Message="Test message" />
<ValidationCase TItem="string" On="@(x => x == "A text")" Message="Test message" />
</InputValidation>
Я закодировал свои компоненты так:
InputValidation
@using System.Linq.Expressions;
@typeparam TItem
@*<span class="form-text text-danger">@Message</span>*@
<CascadingValue Value="Property">
<div>
@ChildContent
</div>
</CascadingValue>
@functions {
[Parameter]
TItem Property { get; set; }
[Parameter]
public RenderFragment<ValidationCase<TItem>>[] ChildContent { get; private set; }
public bool Valid { get; set; }
}
ValidationCase
@using System.Linq.Expressions;
@typeparam TItem
<span id="test" class="form-text text-danger">@Message</span>
@functions {
[CascadingParameter]
private TItem Property { get; set; }
[Parameter]
protected Expression<Func<TItem, bool>> On { get; set; }
[Parameter]
protected string Message { get; set; }
internal bool Valid { get; set; }
protected async override Task OnParametersSetAsync()
{
Valid = !On.Compile().Invoke(Property);
}
}
Что я хотел бы знать:
- Допустим ли этот подход?
- Есть ли способ не вызывать TItem = "string" явно в объявлении ValidationCase?Если мы этого не сделаем, тип параметра выражения не может быть вычтен.Даже если сделать это, вставив CascadingValue.
Спасибо за ответы.
РЕДАКТИРОВАТЬ 03/01:
Мне пришлось действовать иначе,Вместо использования View для ValidationCase я использую имена компонентов только для кода ValCase
[Route("val-case")]
public class ValCase<TItem> : ComponentBase
{
[CascadingParameter]
private InputValidation<TItem> parent { get; set; }
[Parameter]
protected Expression<Func<TItem, bool>> On { get; set; }
[Parameter]
protected string Message { get; set; }
internal bool Valid { get; set; }
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
var seq = 0;
builder.OpenElement(++seq, "li");
builder.OpenElement(++seq, "span");
builder.AddAttribute(++seq, "id", "test");
builder.AddAttribute(++seq, "class", "form-text text-danger");
builder.AddContent(++seq, Message);
builder.CloseElement();
builder.CloseElement();
}
protected override void OnInit()
{
parent.Items.Add(this);
}
protected override bool ShouldRender()
{
return true;
}
protected async override Task OnParametersSetAsync()
{
Valid = !On.Compile().Invoke(parent.Property);
}
}
Рендеринг в порядке ... но только в первый раз.ValCase больше не отображается каждый раз, когда я обновляю значение свойства.Я поместил Console.WriteLine в метод OnParametersSetAsync, но, похоже, этот метод больше не вызывается.
Кто-то может помочь мне найти способ исправить это?