C# 为什么';t我的复选框返回文本属性

C# 为什么';t我的复选框返回文本属性,c#,asp.net,.net,asp.net-mvc,asp.net-core,C#,Asp.net,.net,Asp.net Mvc,Asp.net Core,我有一张表格,里面有这个 <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">

我有一张表格,里面有这个

<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>
这就是我为视图显示和设置模型的方式

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);
}

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

考虑到这一事实,我发现在您的
Features
中,在您的
HttpPost
操作中,只需重新加载可用选项的列表,然后用用户提交的选择更新重建的列表,就更有意义了

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

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");
}