【问题标题】:asp-for in checkbox throws and error in asp.net core复选框中的 asp-for 在 asp.net 核心中抛出和错误
【发布时间】:2019-04-04 07:20:32
【问题描述】:

这里我使用了两个复选框

<label asp-for="SendReport" class="checkbox-inline"><input type="checkbox" asp-for="SendReport" />Send Report</label><br>
<label asp-for="SendInvoice" class="checkbox-inline"><input type="checkbox" asp-for="SendInvoice" />Send Invoice</label><br>

两个 cheboc 的数据类型,即 asp-for="SendReport" and asp-for="SendInvoice"bit
现在的问题是,当我尝试加载页面时,它会抛出如下错误

Unexpected 'asp-for' expression result type 'System.Nullable`1[[System.Boolean, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]' for <input>. 'asp-for' must be of type 'System.Boolean' or 'System.String' that can be parsed as a 'System.Boolean' if 'type' is 'checkbox'.<br>


任何帮助将由衷感谢。谢谢

【问题讨论】:

  • 有什么理由将bit field 绑定到checkboxcheckboxtruefalse 绑定,你是如何决定何时检查checkboxbit 的? bit field 的值是多少?

标签: c# asp.net-core-2.0 razor-pages


【解决方案1】:

这是因为asp-for总是在输入类型为checkbox时需要一个布尔参数,或一个可以解析为布尔值的字符串参数

这就是说,假设SendReportSendInvoice 不是布尔值:

意外的“asp-for”表达式结果类型“System.Nullable”

您必须将这些参数更改为默认为 false 的布尔参数,或默认包含 "false""true" 的字符串参数。

【讨论】:

    【解决方案2】:

    我在使用 EFcore 时遇到了同样的问题。 从数据库中,我有:

    namespace Project.EFCoreModels;
    public partial class Account 
    {
        public int AccountId {get; set;}
        public bool? HasSaleTax {get; set;}    
    }
    

    我想使用 asp 标签助手将HasSalesTax 显示为复选框输入:

    <input type="checkbox" asp-for="HasSaleTax" class="form-control" />
    

    这会导致错误,因为输入类型复选框不接受可为空的值。很公平。

    为了解决这个问题,我创建了另一个分部类,相同的命名空间,但在不同的项目目录(文件夹)上。当我们想要将 MetaData 添加到 EFCore 类时,这是 .NetCore MVC 中的常见模式。

    namespace Project.EFCoreModels;
    public partial class Account 
    {         
        public bool SalesTaxInput 
        {
            get => this.HasSaleTax.GetValueOrDefault(); 
            set {this.HasSaleTax = value;} 
        }    
    }
    

    然后在视图上,您​​只需将输入与新创建的道具绑定:

     <input type="checkbox" asp-for="SalesTaxInput" class="form-control" />
    

    【讨论】:

      【解决方案3】:

      当发生时,使用 bit datatype 作为 reparent true, falsecolumn 允许检查空值

      你可以通过两种方式修复

      首先:将 Not Allow 设置为 null 或删除字段中的 ?

      示例:

      public bool? SendReport {get; set; } 
      // change to below code 
      public bool SendReport {get; set; } 
      

      第二:可以使用普通的html标签进行复选框输入

      <input type="checkbox" id="SendReport" name="SendReport" @((Model.SendReport== false ? "" : "checked")) />
      

      【讨论】:

        【解决方案4】:

        这是一个问题:asp-for="SendReport"。这是无效的,因为 标签是复选框类型的输入,因此asp-for 期待boolean 并且您发送的不是布尔值。

        请参考:
        Asp.net MVC putting checkbox data in a list of booleans

        【讨论】:

        • 具体来说,正在发送一个可为空的boolean (bool?)
        【解决方案5】:

        如果你使用一个

        @Html.EditorFor(m => m.SendReport, new { @class = "form-control" }}
        

        它会给你一个带有选项的下拉框

        <select id="SendReport" name="SendReport" class="list-box tri-state"> 
            <option value="">Not Set</option>
            <option value="true">True</option>
            <option value="false">False</option>
        </select>
        

        至少在使用 Bootstrap 4 和 Visual Studio 2019 以及 .NET Core 3.1 时我会这样做

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-13
          • 2021-11-15
          • 2020-08-11
          • 1970-01-01
          • 2021-06-06
          • 2019-02-01
          • 2017-02-26
          • 2019-11-08
          相关资源
          最近更新 更多