将数据传递给 Blazor 中的模态

Passing data to a modal in Blazor

有没有什么方法可以使用 Razor 语法将多个数据从一个页面传输到一个模式?示例 我有一个包含多个列和行的 table。在其中一列中有一个按钮,您可以使用它来编辑数据。我希望将此行中的数据传输到模态中,以便我可以对其进行编辑。

一种可能性是在一个页面中完成所有操作:网格和对话框。 (这个对话框肯定是div)。

@page "/{Langue}/OrderList"
<div class="content">
    <div class="container">
        <Components.Grid 
                    Id="grid-order-list"
                    ListViewRecords = "new List<int> { 20, 50, 100 }"/>
    </div>
</div>

@if (LineDetails != null)
{
    <!-- Modal Large -->
    <div class="modal fade" id="large-modal">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"><i class="fa fa-times"></i></button>
                    <h6 class="modal-title">@ModalTitle</h6>
                </div>
                <div class="modal-body text-center">
                    <div class="modal-body-inside" style="height: 85vh; overflow-y: auto; padding: 60px 50px 70px;">
                        <UserControls.LineDetail Source="LineDetails " />
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!-- /.modal -->
}

@code {
private MyNameSpace.LineDetailsClass LineDetails;
}

如您所见,只要 LineDetails 为 null,用户就只能看到 table。单击详细信息按钮时,您必须填充 LineDetails。因此将显示模态。 LineDetails 应该绑定到一些文本框,...当用户单击模式中的按钮时,您会在 LineDetails 中获得所需的信息并将其重置为空。

假设你的class名字是Person,就是你的Button代码:

foreach(var item in Items)
{
...
<td><button type="button" @onclick="@Update(item)">Edit</button></td>
...
}

现在我们有一个像这样的所选项目的模型:

@code{

Person SelectedItem {get;set;}

void Update(Person selectedItem)
{
SelectedItem  = selectedItem;
}

现在您可以在任何地方访问您的 SelectedItem,包括模式。

Guy、Henk 和 Ali 的想法都很正确。 不过,我想补充一点,您几乎可以将@onclick 添加到任何内容——div、table 行等

一般模式是有一个 List<SomeClass> AllItems,然后是一个 SomeClass SelectedItem,然后是空检查。

YourModalControl.razor

<div>Show something from SelectedItem: @SelectedItem.DisplayString</div>
<button @onclick="CloseMe">Close</button>
@code{
    [Parameter]
    public SomeClass SelectedItem {get; set;}
    
    [Parameter]
    public EventCallback<SomeClass> SelectedItemChanged{get; set;}
    
    async Task CloseMe(){
        SelectedItem = null;
        SelectedItemChanged.InvokeAsync(SelectedItem);
    }
}

ConsumingPage.razor

@if (SelectedItem is not null){
    <YourModalDisplayControl @bind-SelectedItem="SelectedItem" />
}
@else foreach (var item in AllItems){
    <div @onclick="()=> SelectedItem = item">@item.DisplayString</div>
} 

@code {
    List <SomeClass> AllItems {get; set;}
    SomeClass SelectedItem {get; set;}
}