Динамическая привязка входного текста к свойствам класса / объекта с помощью Blazor - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь построить динамический c список полей ввода для свойств внутри класса, используя Blazor, но не могу понять, как связать / связать содержимое поля ввода со свойством класса. (класс может иметь большое количество объектов c publi, не только Name и Description, как в приведенном ниже примере, они не всегда имеют тип "string")

допустим, у меня есть этот класс / модель:

public class customer{
        public string Name { get; set; }
        public int Age { get; set; }
        public string Description { get; set; }

}

Я получил этот компонент блейзора ( обновление C .razor ):

@inherits CLogic    
@if (nfo != null)
{
      @foreach (var obj in nfo)
      {
             <input type="text" class="form-control"      
             bind=@SCustomer.GetType().GetProperty(obj.ToString())/>
      }
}

и, наконец, Clogi c:

public class Clogic: ComponentBase{
    [Parameter]
    public Customer SCustomer { get; set; } = new Customer();
    [Parameter]
    public PropertyInfo[] nfo { get; set; }

    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            nfo = SCustomer.GetType().GetProperties();
            StateHasChanged();
        }
    }
}

Предполагается, что изменения, внесенные в каждое поле ввода, привязываются к правильному свойству в текущем экземпляре SCustomer (когда ввод сделан, предполагается обновить правильное свойство класса / объекта) . Это не работает, значения внутри SCustomer не изменяются после ввода. Я предполагаю, что я делаю это совершенно неправильно, но не могу понять, как это сделать, и не могу найти никаких примеров, делающих это.

Ответы [ 3 ]

1 голос
/ 20 февраля 2020
@foreach (var propertyInfo in nfo)
{
    <input type="text" class="form-control"      
    value="@propertyInfo.GetValue(SCustomer)" 
    @onchange="@((ChangeEventArgs __e) =>
       propertyInfo.SetValue(SCustomer, __e.Value.ToString()))" />
}
0 голосов
/ 28 марта 2020
@foreach(propertyInfo in nfo)
{
  <label>@propertyInfo.Name</label>
  <input type="text" value="@propertyInfo.GetValue(SCustomer)" @onchange="@((ChangeEventArgs __e) => 
    propertyInfo.SetValue(SCustomer,Convert.ChangeType(__e.Value, 
    propertyInfo.PropertyType,null))"/>
}
0 голосов
/ 21 февраля 2020

Я наконец нашел способ сделать это, вот мое решение: я создал вспомогательный класс:

public class PropHolder
    {
        [Parameter]
        public PropertyInfo info { get; set; }
        [Parameter]
        public string type { get; set; }
        public PropHolder(PropertyInfo nfo, string propType)
        {
            info = nfo;
            type = propType;
        }
    }

, затем я создал словарь этого класса и некоторые функции проверки (это внутри Clogi c)

[Parameter]
        public Dictionary<int, PropHolder> Props{ get; set; }
        public void GetAllProps()
        {
            Props = new Dictionary<int, PropHolder>();
            //nfo = SCustomer.GetType().GetProperties();
            int Cid = 0;
            foreach (PropertyInfo pif in SCustomer.GetType().GetProperties())
            {
                Props[Cid] = new PropHolder(pif, pif.PropertyType.Name);
                Cid++;
            }
        }

        public string CheckName(PropHolder propertyInfo)
        {
            if (propertyInfo.GetType() == typeof(PropHolder))
            {
                return propertyInfo.type;
            }
            else
            {
                return propertyInfo.GetType().Name.ToString();
            }

        }
        public PropertyInfo getInfo(PropHolder propertyInfo)
        {
            if (propertyInfo.GetType() == typeof(PropHolder))
            {
                return propertyInfo.info;
            }
            else
            {
                return null;
            }
        }

и, наконец, я могу l oop над ключами моего словаря и правильно связать все значения (получил много помощи вычисляя это из ответа, данного: "Агуа из Марса") вот это обновление C .razor содержание:

@if (Props != null)
        {

            @foreach (int key in Props.Keys)
            {

                var pinfo = Props[key];
                @if (CheckName(pinfo) == "String")
                {
                    <input type="text" class="form-control" value=@(getInfo(pinfo).GetValue(SCustomer)) @onchange="@((ChangeEventArgs __e) => getInfo(pinfo).SetValue(SCustomer, __e.Value.ToString()))" />
                }
            }
        }

это дает мне поле ввода для каждого реквизита, имеющего тип String, если дополнительные типы должны обрабатываться, теперь его можно легко добавить. Это, вероятно, не лучшее решение, но оно работает. Я обновлю ответ, если будут опубликованы какие-либо лучшие рабочие решения.

...