Asp下拉列表布尔值总是设置为false?

时间:2018-03-08 14:58:44

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

这是我的观点

    <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;。

2 个答案:

答案 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"控件

的代码帮助程序的详细信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms#the-select-tag-helper

P.S。如果你只是根据你的示例代码绑定到一个简单的True / False bool,从可用性的角度来看,Checkbox可能是更合适的表单控件类型。然后,用户只需单击一次即可设置值,而不是两次。

如果要绑定到其他类型,例如int或string,以便您可以为该字段提供大量潜在值,并且您希望动态填充选项列表(例如,从数据库数据),您可以使用<select>帮助程序标记告诉ASP.NET从服务器变量加载列表 - 详细信息和示例显示在上面链接的文档中。

答案 1 :(得分:-1)

请考虑底部三注:

  1. for false选项不需要为选项赋值。
  2. 不需要在代码中要求属性。
  3. 请在select标签中命名属性(不需要id)
  4. 查看:

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