【问题标题】:Blazor - Create select box dynamicallyBlazor - 动态创建选择框
【发布时间】:2020-06-11 00:30:22
【问题描述】:

我正在将一个旧的 JavaScript/JQuery 应用程序翻译成 Blazor,我需要弄清楚的最后一件事是如何将带有选项的选择下拉列表动态添加到 UI 上。

在旧的 JavaScript 程序中,我通过使“+”可点击来做到这一点:

<span class="add"><span class="add2"> + </span>

当点击时,它调用了一个 .on("click") ,它只是用一个 .insertAfter 渲染了 html,并且选择框在前一个元素之后动态出现(也恰好是一个选择框)。底部的计数 > 2 使超过 2 个选择不会被添加:

$('.add').on('click', function(){
    var everything = "<select name='number" + (count + 1) + "' class='number" + (count + 1) + "'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option></select>'";
    $(everything).insertAfter('.number' + count).addClass('add2');
    count +=1;
    if(count > 2){
    $('.add').remove();
    }
});

在 Blazor 中,似乎有一些方法可以在没有 JavaScript 的情况下执行此操作,我想这就是 Blazor 的全部要点,例如带有“.AddContent”和“.AddAttribute”等方法的“RenderFragment”。我还没有找到足够的关于这种技术的文档来知道它是否可行。这是 Blazor 计划在 UI 中添加/删除元素的方式吗?我在正确的道路上吗?还是很冷,哦,这么冷?我想以最近推荐的 Blazor 方式执行此操作。

任何建议、指示或文档将不胜感激!

【问题讨论】:

    标签: javascript c# asp.net-core blazor


    【解决方案1】:

    您不需要直接使用任何 RenderFragment() 方法。只需创建一个简单的 Blazor 组件即可:

    • 用于保存动态表单状态“描述”的视图模型
    • 将视图模型转换为 HTML 的相应逻辑

    类似下面的东西可以完成工作;请参阅内联 cmets 进行解释:

    @page "/Test"
    
    
    @*Render the button if current number of select boxes is less than 2*@
    @if (SelectBoxes.Count < 2)
    {
        <div>
            <button type="button" class="btn btn-primary" @onclick="AddSelectBox">Add</button>
        </div>
    }
    
    @*Render the corresponding number of select boxes*@
    @foreach (var box in SelectBoxes)
    {
        <div>
            <select class="number@(box + 1)">
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
    
        </div>
    }
    
    @code {
    
        // this is your view model, ie. a collection of "IDs" of the select boxes
        List<int> SelectBoxes = new List<int>();
    
    
        // this method will add a new item to the collection of select boxes
        void AddSelectBox()
        {
            SelectBoxes.Add(SelectBoxes.Count);
        }
    }
    
    
    

    【讨论】:

    • 太好了!谢谢!我有 1 个后续问题,我正在尝试为每个动态添加的选择添加“@bind”属性,而 Blazor 似乎不喜欢为此设置动态值 - 选择出现,但不会持有价值。我还在尝试。
    • @ewomack 您的视图模型看起来如何?此处的方法将再次相同:创建一个视图模型(例如,将保存值的对象集合)并将选择绑定到集合。与答案中显示的逻辑相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多