Можно ли заменить часть строки динамическим связыванием c 2? - PullRequest
0 голосов
/ 03 мая 2020

Цель

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

Пример

    public class TemplateService
    {
        private List<NameValuePairs> _labels = new List<NameValuePairs>
        {
            new NameValuePairs(){Name="Name", Value="John"},
            new NameValuePairs(){Name="Age", Value="27"},
            new NameValuePairs(){Name="Height", Value=""},
            new NameValuePairs(){Name="Hair Colour", Value=""},

        };

        public Task<Template> GetTemplateByIdAsync(int id)
        {
            Template t = new Template() { Labels = _labels, Text = @"Hi, my name is {{Name}}. I am {{Age}} years old" };
            return Task.FromResult(t);
        }
    }
@inject TemplateService TemplateService

<h3>Text Templates</h3>

@if (template == null)
{
    <p><em>Loading...</em></p>
}
else
{
    @foreach (var label in template.Labels)
    {
        <label>
            @label.Name :
            <input @bind-value="label.Value" @bind-value:event="oninput" />
        </label>
    }

    <h4>Model</h4>
    @foreach (var l in template.Labels)
    {
        <p>@l.Value</p>
    }

    <h4>Interpolated</h4>
    //HERE I WANT TO DISPLAY A RESULT OF template.text WHEREBY {{Name}} WOULD BE SUBSTITUTED WITH JOHN IN THIS CASE, AND WOULD CHANGE AS THE INPUTBOX FOR NAME IS TYPED IN 

}

@code {
    private Template template;

    protected override async Task OnInitializedAsync()
    {
        template = await TemplateService.GetTemplateByIdAsync(1);
    }
}

Это интерполированный бит в представлении, с которым я застрял. У меня есть контроль над службой, поэтому я подумал о замене {{Age}} на функцию, подобную @FindValueForName ("Age"), но не уверен, что это можно вставить как исполняемый код вместо литеральной строки. Любые мысли о том, как это может быть достигнуто каким-либо образом?

1 Ответ

0 голосов
/ 05 мая 2020

Если вы можете немного реструктурировать, вы можете попробовать это

public class Template
{
 public List<NameValuePairs> Labels { get; set; }
 public Func<string> Text { get; set; }
}

public class TemplateService
{
 private List<NameValuePairs> _labels = new List<NameValuePairs>
 {
  new NameValuePairs(){Name="Name", Value="John"},
  new NameValuePairs(){Name="Age", Value="27"},
  new NameValuePairs(){Name="Height", Value=""},
  new NameValuePairs(){Name="Hair Colour", Value=""},
 };

 public string GetListValue(string Name) => _labels.Find(lbl=>lbl.Name==Name).Value;
 public Task<Template> GetTemplateByIdAsync(int id)
 {
  Template t = new Template() 
   { 
    Labels = _labels, 
    Text = () => $@"Hi, my name is {GetListValue("Name")}. I am {GetListValue("Age")} years old" };
    return Task.FromResult(t);
 }
}
...
<h4>@template.text()</h4>
...