【问题标题】:Asp dropdown list boolean value is always set to false?asp下拉列表布尔值总是设置为false?
【发布时间】:2018-03-08 14:58:44
【问题描述】:

这是我的看法

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

问题是发送到控制器方法的值总是假的,即使我选择“是”选项。

【问题讨论】:

  • 您没有为您的控件设置“名称”值,因此它永远不会被回发。可能您最好使用 asp-for 助手来正确设置值,就像您为标签所做的那样。
  • 如何发送给控制器?阿贾克斯?邮寄表格?我在该输入上没有看到 name 属性,因此它不会发布它。
  • 你有一个 id,但在 select 元素上没有名字。模型绑定器使用名称属性
  • @Fran 小点,但从技术上讲,模型绑定器处理在 HTTP 请求中提交的参数。它是浏览器在解析使用 name 属性的表单时用来决定发送哪些参数的机制。请求中参数的内容仍然可以通过脚本进行更改。或者,请求可以由非浏览器客户端提交,那么具有“名称”属性的表单元素的概念是完全多余的,但如果 HTTP 请求中的数据正确,模型绑定器仍然会绑定它。跨度>
  • 我正在使用form method="post",有谁能告诉我如何使用这个“name”属性吗?

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


【解决方案1】:

您没有为控件设置“名称”值,因此它永远不会被回发。

在您的情况下,由于您使用的是 ASP.NET Core MVC,因此解决此问题的最佳方法是在您的选择中使用 asp-for 标签助手,就像您对标签和验证控件所做的那样与模型的相同“Product.InStock”属性相关联。

<select class="form-control" asp-for="Product.InStock">

这样,ASP.NET 将在控件上生成正确的 id 和 name 属性,以便在表单回发时绑定到您的模型。

当然,如果您的视图模型直接是Product(而不是某些视图模型,其中Product 只是其中一个属性),那么所有您的asp-for 标签与@987654327 相关@ 需要简单地改为 asp-for="InStock"

有关&lt;select&gt; 控件的标签助手的更多详细信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms#the-select-tag-helper

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

如果你想绑定到其他类型,例如int 或字符串,这样您就可以为该字段提供许多潜在值,并且您希望动态填充选项列表(例如,从数据库数据中)您可以使用 asp-items 帮助标记告诉 ASP.NET 加载来自服务器变量的列表 - 详细信息和示例显示在上面链接中的文档中。

【讨论】:

  • 你的变量名需要product!
  • 我的答案是正确的,请在投反对票之前测试它。
  • @AliRasouli "你的变量名需要产品!"你愿意解释一下吗?正如我所解释的,它可能是,具体取决于模型定义是什么。 OP没有具体说明。但是,在 您的 示例中,它肯定 不正确,因为您为回发指定了一个不包括 Product anywhere 的模型。
  • 请测试底部答案并调试和跟踪它。
  • @ADyson 是的,我已将下拉列表更改为复选框,现在它工作正常
【解决方案2】:

请考虑底部三注:

  1. 对于 false 选项不需要为选项赋值。
  2. 不需要在代码中要求属性。
  3. 请在选择标签中命名属性(不需要id)

查看:

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

【讨论】:

  • 如果您不打算在视图中使用它,那么设置[Display(Name = "Available")] 有什么意义?您出于某种原因删除的标签助手的全部意义在于将模型巧妙地绑定到包括所有元数据的视图,而不必无休止地重复相同的文本、值、属性等,并确保更改对模型不要默默地破坏视图。
  • 此外,如果模型是 testClass 并且“InStock”是模型的属性,那么它需要是 name="InStock" - 请参阅我的答案。您的示例模型中没有“产品”属性之类的东西。
  • 产品是变量名,其中包含另一个名为 InStock 的变量。
  • "产品是变量名称,其中包含另一个名为 InStock 的变量。" ...但在您上面的示例中,public class testClass { [Display(Name = "Available")] public bool InStock { get; set; } } 表明该语句不正确。告诉我,“产品”在哪里?仅仅因为您调用输入变量 Product 不相关,模型绑定器就不会使用它。它将名称直接绑定到模型的属性,没有子级别。
  • 我从我的代码中删除了 [Display(Name = "Available")] 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2019-06-10
  • 2016-06-24
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多