Как я могу передать словарь компоненту blazor?

#dynamic #types #casting #blazor

Вопрос:

Я пытаюсь передать словарь в качестве параметра компоненту blazor. Словарь должен хранить <строка, динамическая>, <строка, динамическая><строка, список> и <строка, список><строка, Словарь<строка, динамическая><строка, динамическая>> пары ключ-значение.

Я попытался это сделать, но получил ошибку «»EventCallbackFactory» не имеет применимого метода с именем «CreateBinder», но, похоже, имеет метод расширения с этим именем. Методы расширения не могут быть динамически отправлены».

Является ли то, что я пытаюсь сделать, действительным, а если нет, то почему? Есть ли другой способ, которым я должен подойти к этому?

Вот код для моего компонента blazor, для справки:

 @page "/dictitemcomponent"
@using System.Collections.Generic;

<ul>
    @foreach (KeyValuePair<string, dynamic> item in thisDict)
    {
        
        @if(item.Value.GetType() == typeof(Dictionary<string, dynamic>))
        {
            <li>@item.Key.ToString() : </li>
            @foreach (var dict in item.Value)
            {
                <DictItemComponent thisDict=dict/>
            }
        }
        
        @if(item.Value.GetType() == typeof(List<dynamic>))
        {
            <li>@item.Key.ToString() : </li>
            @foreach (var value in item.Value)
            {
                <li>@value</li>
            }
        }
        
        @if(item.Value.GetType() != typeof(List<dynamic>) amp;amp; item.Value.GetType() != typeof(Dictionary<dynamic, dynamic>))
        {
            <li>@item.Key.ToString() : <input @bind="item.Value"/></li>       
        }
    }
</ul>

@code
{
    public KeyValuePair<string, dynamic> newProperty = new KeyValuePair<string, dynamic>();
    [Parameter] public Dictionary<string,dynamic> thisDict {get; set;}= new Dictionary<string, dynamic>();

    //convert the value of a KVP to a dictionary
    public void ValueToProperty(KeyValuePair<string,dynamic> property)
    {
        string key = property.Key;
        property = new KeyValuePair<string, dynamic>(key, new Dictionary<string, dynamic>());
    }

    public void ValueToList(KeyValuePair<string,dynamic> property)
    {
        string key = property.Key;
        property = new KeyValuePair<string, dynamic>(key, new List<dynamic>());
    }
}
 

Ответ №1:

Могу я узнать, чего вы пытаетесь достичь?
Основываясь на вашем первом утверждении if, зачем вам нужен словарь внутри словаря? Прочитав ваше исключение и ваше 3-е условное утверждение, кажется, что вы пытаетесь привязать входные данные к значению вашего словаря. Однако это не то, как вы должны использовать словарь. Если вы не привязаны к обычному свойству «тип» (например, строка), вы можете использовать @bind=someVariable . В противном случае в словаре каждое значение должно привязываться к соответствующему ключу и, следовательно, @bind=_dict[key] (синтаксис»сокращенного» для @bind-value и @bind-value:event ) вместо привязки ввода к item.value . Для более легкого понимания я описал вышеупомянутый условный оператор и смоделировал решение проблемы в следующих строках. Он должен отображать значение <label> рядом с во input время onchange :

 @page "/dict"
@foreach (var kvp in _dict)
{
<div>
    <label>@kvp.Key</label>
    <input @bind=_dict[kvp.Key] />
    <label>Key:@kvp.Key|Value:@kvp.Value</label>
}
@code {
    private Dictionary<string, string> _dict = new()
    {
        ["1"] = "One",
        ["2"] = "Two",
        ["3"] = "Three",
        ["4"] = "Four",
        ["5"] = "Five",
    };
}

Meanwhile, you should simplify your if statements as follow:

@if(item.Value.GetType() == typeof(Dictionary<string, dynamic>))
{
    //dowork
}
else if(item.Value.GetType() == typeof(List<dynamic>))
{
    //do more work
}
else
{
    //do other work
}

[Screenshot for my Input fields rendered based on Key Value Pair and value entered][1]


  [1]: https://i.stack.imgur.com/iG6Mr.png