【问题标题】:Why are my single select lists converting to multi select lists on model binding?为什么我的单选列表在模型绑定上转换为多选列表?
【发布时间】:2020-04-13 05:51:21
【问题描述】:

我正在尝试将多个单选列表绑定到我的视图模型中的一个字符串列表我有属性:public List<string> Items {get; set;} 并且在我看来我有 3 个带有单选选项的选择列表,但是当我尝试建模时使用 asp-for="@Model.Items" 将我的选择列表绑定到 Items 属性,我的所有单选列表都转换为多选列表。为什么?

我的看法:

<form asp-controller="Admin" asp-action="Index" method="post">
    <div class="col-12">
        <div class="row">
            <div class="form-group col-4">
                <div class="d-inline-block">
                    <label>Order By Price:</label>
                </div>
                <div class="d-inline-block">
                    <select class="form-control" asp-for="@Model.Items" style="width:150px">
                        <option value="Ascending">Ascending</option>
                        <option value="Descending">Descending</option>
                    </select>
                </div>

            </div>
            <div class="form-group col-4">
                <div class="d-inline-block">
                    <label>Order By Name:</label>
                </div>
                <div class="d-inline-block">
                    <select class="form-control" asp-for="@Model.Items"  style="width:150px">
                        <option value="A-Z">A-Z</option>
                        <option value="Z-A">Z-A</option>
                    </select>
                </div>
            </div>
            <div class="form-group">
                <div class="d-inline-block">
                    <button type="submit" class="btn btn-secondary">Confirm</button>
                </div>
            </div>
        </div>
    </div>
</form>

控制器:

[HttpPost]
        public IActionResult Index(MangeProductsViewModel vm)
        {
            return View(new MangeProductsViewModel
            {
                Products = productRepository.Products.ToList().SortProducts(vm)
            });
        }

我的视图模型

public IEnumerable<Product> Products { get; set; }
public List<string> Items { get; set; }

当我从列表中选择项目时,它会正确添加它们,问题是用户可以从一个列表中选择多个选项

【问题讨论】:

  • 请分享生成的选择列表的html代码sn-p
  • 我为我的视图和控制器添加了代码

标签: asp.net-core asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

这是因为asp-for 调用了一个标签助手,并且对于List&lt;string&gt; 类型的道具,生成的HTML 将是一个选择多个。但是,这对您不起作用无论如何,因为它会给所有选择赋予相同的名称。因此,它们只会相互覆盖,而不是相互添加。

为此,您将不得不通过以下方式手动处理事情:

<select name="Items[]">
    @foreach (var option in Model.SelectList1Options)
    {
        <option value="@option.Value">@option.Text</option>
    }
</select>

对于每个下拉菜单。

【讨论】:

  • 你错了,因为它会向列表添加值,问题是用户可以从列表中选择多个选项
【解决方案2】:

试试这个!

在您的 HttpGet 方法中创建一个长度为 3 的新列表并将其分配给模型的 Items 属性并将模型传递给查看。

并在视图中写 asp-for 如下

asp-for="@Model.Items[0]"

asp-for=“@Model.Items[1]”

asp-for="@Model.Items[2]"

【讨论】:

  • 没有动态选项? Couz 如果后者在我添加新的选择列表时我需要手动更改数组大小
  • 那我猜你只需要在客户端控制多选行为。
  • 即使现在您正在修复视图中的选择数量。稍后,如果您想添加更多选择,则必须编辑视图
  • 是的,但我想让我的代码尽可能容易扩展
  • 然后从应用设置中驱动限制
【解决方案3】:

原因是你使用了asp-for="@Model.Items",因为你的item类型是List&lt;string&gt;,所以下拉列表设置为多选。

只需改用name="Items"

<form asp-controller="Managers" asp-action="SelectTest" method="post">
    <div class="col-12">
        <div class="row">
            <div class="form-group col-4">
                <div class="d-inline-block">
                    <label>Order By Price:</label>
                </div>
                <div class="d-inline-block">
                    <select class="form-control" name="Items" style="width:150px">
                        <option value="Ascending">Ascending</option>
                        <option value="Descending">Descending</option>
                    </select>
                </div>

            </div>
            <div class="form-group col-4">
                <div class="d-inline-block">
                    <label>Order By Name:</label>
                </div>
                <div class="d-inline-block">
                    <select class="form-control" name="Items" style="width:150px">
                        <option value="A-Z">A-Z</option>
                        <option value="Z-A">Z-A</option>
                    </select>
                </div>
            </div>
            <div class="form-group">
                <div class="d-inline-block">
                    <button type="submit" class="btn btn-secondary">Confirm</button>
                </div>
            </div>
        </div>
    </div>
</form>

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多