【问题标题】:Why doesn't my checkbox return a text property为什么我的复选框不返回文本属性
【发布时间】:2020-07-10 20:26:01
【问题描述】:

所以我有这个表格,里面有这个

<div class="form-group">
    @*<div class="form-check form-check-box">


    @for (int i = 0; i < Model.Features.Count; i++)
    {
        <div class="form-check form-check-box">
            <input class="form-check-input" type="checkbox" asp-for="@Model.Features[i].Selected" value="@Model.Features[i].Text">
            <label class="form-check-label" asp-for="@Model.Features[i].Text">@Model.Features[i].Text</label>
        </div>
    }
</div>

当我发布表单并检查 SelectedListItem 的属性时,它看起来像这样

尽管Selected 应该是True,因为我检查了它。表单中的其他所有内容都可以正常发布,例如文本输入很好地绑定到我的 ProductModel 中的字符串 Text 属性,我相信问题出在我使用复选框元素属性的方式上。

所以我可以看到复选框,我可以检查它们等,但是当我发布表单时,与复选框相关的任何内容都不适用于 ProductModel

public class ProductModel
{
    public string Title { get; set; }
    public IList<SelectListItem> Features { get; set; }
}

这就是我为视图设置模型的方式

public IActionResult PostAd()
{
    var model = new ProductModel
    {
        Features = new List<SelectListItem>()
        {
            new SelectListItem { Text = "Camera", Value = "Camera" },
            new SelectListItem { Text = "Touch Screen", Value = "Touch Screen" }
        }
    };

    return View(model);
}

如何正确使用复选框,以便在发布表单时将数据传递给模型? 这是发布时触发的操作

[HttpPost]
public IActionResult CreateAd(ProductModel Product)
{
    return View("Index");
}

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-core


    【解决方案1】:

    您遇到的问题是,当表单发布时,ASP.NET 会将发布的数据绑定到您的模型,但只会发布表单中的输入 。您的 SelectListItem 具有 null TextValue 属性的原因是因为这些值没有发布在表单中。表单需要包含@Model.Features[i].Text 的输入(例如隐藏输入)和@Model.Features[i].Value 的另一个输入,以便在模型绑定期间将它们绑定回SelectListItem,因为绑定它的是输入的name到模型属性。但请记住,即使是从隐藏的输入中接收这些,用户也可以将它们更改为他们想要的任何值,因此您需要在服务器端验证它们是 1) 有效值和 2) 允许选择。

    鉴于这一事实,我发现在 HttpPost 操作中简单地重新加载可用选项列表(在您的情况下为 Features)更有意义,然后使用用户提交的选择更新该重建列表。

    现在剩下的唯一问题是您甚至没有将Selected 设置为true。这又是一次,因为它基于输入的(复选框)valueasp-for="@Model.Features[i].Selected" 将为复选框提供它需要绑定回该属性的name,并将其value 属性绑定到Selected 的值。但是,您还可以将自己的value 属性定义为value="@Model.Features[i].Text",它会覆盖asp-for 助手生成的属性。因此,当您提交表单时,模型绑定器会尝试将 "Camera" 绑定到布尔值 Selected 属性,但这是无法完成的,因此它只会获取默认的 false 值。通常,SelectListItem 用于下拉 (&lt;select&gt;) 输入。您没有理由不能将其用于此目的,但您也可以将自己的模型类型用于复选框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多