【问题标题】:How can I get a cascading value in Blazor?如何在 Blazor 中获得级联值?
【发布时间】:2019-08-26 10:10:08
【问题描述】:

我有一个表单,用户首先在下拉列表中选择一个公司,然后基于此他们可以从下拉列表中选择一个项目。从数据库中查询的项目是基于用户和公司的。

我曾尝试关注一篇关于 cascadingdropdownlist 的旧帖子:https://www.mikesdotnetting.com/article/320/improved-cascading-dropdowns-with-blazor,但这已经相当老了,而且似乎与当前文档有很大不同。去年,Blazor 发生了很多事情。在阅读当前的 Blazor 官方文档 (https://docs.microsoft.com/en-us/aspnet/core/blazor/components?view=aspnetcore-3.0#cascading-values-and-parameters) 时,我看到他们有一个名为“CascadingValue”的“HTML”标签,这对我来说是正确的方法吗?如果是这样,有人可以给我看一个如何做到这一点的例子吗?

<EditForm Model="@expense" Context="formContext" OnValidSubmit="@HandleValidSubmit">
                    <DataAnnotationsValidator />
                    <ValidationSummary />
<div style="float:left;width: 40%;">
                        <label asp-for="Client" class="control-label">Selskap</label>
                        <select asp-for="Client" class="form-control" @bind="@expense.Client">
                            <option></option>

                            @foreach (var ExpClient in cList)
                            {
                                <option selected="selected">
                                    @ExpClient.client
                                </option>
                                <option value="@ExpClient.client">@ExpClient.client</option>
                            }
                        </select>
                    </div>
                    <div style="clear:both;">&nbsp;</div>
                    <div style="float:left;width: 50%;">
                        <label asp-for="Project" class="control-label">Prosjekt</label>
                        <select asp-for="Project" class="form-control" @bind="@expense.Project">
                            <option></option>
                            @foreach (var ExpPro in ProList)
                            {
                                <option selected="selected">
                                    @ExpPro.Project
                                </option>
                                <option value="@ExpPro.Project">@ExpPro.Project</option>
                            }
                        </select>
                    </div>
</EditForm>

@code{

protected void GetExpProList()
    {
               ProList = objexpense.GetExpProList(userN).ToList();
    }
}

现在它只获取基于用户名的项目,这可行,但我 还需要获取选中的客户端,让usernN和client都传给查询DB的方法。

如果有人能在这里指出正确的方向,我将不胜感激。

编辑: 我的解决方案最终看起来像这样,基于我在这里得到的答案,也受到 Mikesdotnetting (https://www.mikesdotnetting.com/article/320/improved-cascading-dropdowns-with-blazor) 的影响:

        <InputSelect id="Client" class="form-control" @bind-Value="@expense.Client">
                        <option value=@(0)></option>

                        @foreach (var ExpClient in cList)
                {

                        <option value="@ExpClient.client">@ExpClient.client</option>
                }
                    </InputSelect>
                </div>
                @if (expense.Client != default ){
                <div style="clear:both;">&nbsp;</div>
                <div style="float:left;width: 50%;">

                    <label id="Project" class="control-label">Prosjekt</label>
                    <InputSelect id="Project" class="form-control" @bind-Value="@expense.Project">
                        <option value=@(0)></option>
                        @foreach (var ExpPro in objexpense.GetExpProList(userN,expense.Client).ToList())
                {

                        <option value="@ExpPro.Project">@ExpPro.Project</option>
                }
                    </InputSelect>
                </div>
                }

【问题讨论】:

  • 小提示:您可以像这样:&lt;option hidden&gt;&lt;/option&gt;,而不是解决方案中的&lt;option value=@(0)&gt;&lt;/option&gt;。这样,只有在没有选择其他选项时才会显示空选项。由于缺少值属性,选择空选项时验证失败。
  • 谢谢,你知道有没有办法让它默认选择第一个值,这样你就不必主动从项目列表中选择值?通常只有一个值,因此选择它似乎有些不必要。
  • 我认为您必须在加载 cList 后在代码部分中执行此操作。像这样的东西:expense.Client = cList.FirstOrDefault().client 但我想你必须检查cList.FirstOrDefault() 是否不为空。

标签: forms blazor cascadingdropdown


【解决方案1】:

有一个叫做InputSelect的组件,你可以绑定一个值。

<InputSelect @bind-Value="selectedClient" class="form-control">
    @foreach (var ExpClient in cList)
    {
        <option value="@ExpClient.client">@ExpClient.client</option>
    }
</InputSelect>

对于第二个下拉菜单,如下所示:

<InputSelect @bind-Value="selectedProject" class="form-control">
    @foreach (var ExpPro in objexpense.GetExpProList(userN, selectedClient).ToList())
    {
        <option value="@ExpPro.Project">@ExpPro.Project</option>
    }
</InputSelect>

【讨论】:

  • 这行得通,谢谢。对我来说似乎是一个不错且干净的解决方案。
  • 很高兴听到我能帮上忙!
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多