绑定动态输入

时间:2018-11-12 04:09:06

标签: c# razor asp.net-core

我有一个具有动态输入的表单,所以我不知道输入的数量和名称,正如您在下面的代码中看到的那样,它们来自数据库。

 <div class="panel-body">
    <form asp-action="BrandFilter" method="get">
        <div class="form-group">
            @foreach (var brand in Model)
            {
                <div class="checkbox">
                    <label>
                        <input asp-for="@brand" type="checkbox" />@brand (10)
                    </label>
                </div>
            }
        </div>
        <button class="btn btn-default btn-sm btn-primary"><i class="fa fa-pencil"></i> Apply</button>
    </form>
</div>

问题是提交表单时如何绑定所有输入。

public async Task<IActionResult> BrandFilter( /* ??? /*)

2 个答案:

答案 0 :(得分:1)

我创建了一个演示,您可以选择品牌并将所有复选框的值传递给控制器​​。

1.Brand.cs

public class Brand
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public bool Selected { get; set; }
}

2。查看

@model List<Models.Brand>
<div class="col-md-4">
    <form asp-action="BrandFilter" method="post">
        <div class="form-group">

            @for (int i = 0; i < Model.Count(); i++)
            {
                <div class="checkbox">
                    @Html.HiddenFor(m => m[i].Name)
                    @Html.CheckBoxFor(m => m[i].Selected)
                    @Html.DisplayFor(m => m[i].Name)
                </div>
            }

        </div>

        <div class="form-group">
            <input type="submit" value="Submit" class="btn btn-default" />
        </div>
    </form>
</div>

3.controller

 public async Task<IActionResult> BrandFilter(List<Brand> brands)

答案 1 :(得分:0)

以上答案确实有效,但我也发现了另一种方法。

在CSHTML文件中:

<input name="@brand.Name" type="checkbox" value="true"/>@brand.Name (@brand.Count)

方法签名:

 public async Task<IActionResult> BrandFilter(Dictionary<string, bool> brands)

在这种方法中,您只接收已检查的输入,从而减少了发送到服务器的数据。

因此,与其发布其他问题,不如在此答案下评论并说出您对这两种方法的看法以及哪种方法更好?