这是我的观点
<div class="form-group">
<label asp-for="Product.InStock">Available:</label>
<select class="form-control" id="Product.InStock">
<option value="False">No</option>
<option value="True">Yes</option>
</select>
</div>
这是型号Product.cs
[Required]
[Display(Name = "Available")]
public bool InStock { get; set; }
问题是发送到Controller方法的值总是为false,即使我选择选项&#34;是&#34;。
答案 0 :(得分:0)
您没有为控件设置“名称”值,因此永远不会回发。
在您的情况下,由于您使用的是ASP.NET Core MVC,解决此问题的最佳方法是在您的选择中使用asp-for
标记帮助程序,就像您对标签和验证控件一样它与您模型的相同“Product.InStock”属性相关联。
<select class="form-control" asp-for="Product.InStock">
这样,ASP.NET将在控件上生成正确的id和name属性,以便在表单回发时绑定到您的模型。
当然,如果您的视图的模型直接Product
(而不是某些ViewModel Product
只是其中的一个属性),那么 all 您的{{1}与asp-for
相关的标记需要简单InStock
。
有关asp-for="InStock"
控件
P.S。如果你只是根据你的示例代码绑定到一个简单的True / False bool,从可用性的角度来看,Checkbox可能是更合适的表单控件类型。然后,用户只需单击一次即可设置值,而不是两次。
如果要绑定到其他类型,例如int或string,以便您可以为该字段提供大量潜在值,并且您希望动态填充选项列表(例如,从数据库数据),您可以使用<select>
帮助程序标记告诉ASP.NET从服务器变量加载列表 - 详细信息和示例显示在上面链接的文档中。
答案 1 :(得分:-1)
请考虑底部三注:
查看:
<div class="form-group">
<label for="InStock">Available:</label>
<select class="form-control" name="Product.InStock" id="InStock">
<option @(ViewBag.Product!=null || ViewBag.Product.InStock==false? "selected":"")>No</option>
<option @(ViewBag.Product!=null && ViewBag.Product.InStock? "selected":"") value="true">Yes</option>
</select>
</div>
控制器:
public class testClass
{
public bool InStock { get; set; }
}
public ActionResult UserPermission(testClass Product)
{
ViewBag.Product=Product;
//Product.InStock filled true if yes option is selected
return View()
}