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