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
具有nullText
和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");
}