代码之家  ›  专栏  ›  技术社区  ›  MKF

未绑定到模型的复选框

  •  0
  • MKF  · 技术社区  · 6 年前

    我的应用程序是这样工作的:用户从下拉列表中选择一个项目,然后加载一个局部视图。返回部分视图的控制器操作从数据库中提取数据,并用数据库中存在的值填充部分视图中的复选框。要做到这一点,很明显,模型返回的是部分视图。这很管用。

    现在,如果用户更改复选框的值并再次提交表单,我假设复选框的新值将绑定到模型,因此,我可以使用它用新值更新数据库。不幸的是,即使选中了复选框,所有内容都返回为“false”。我明白如果 不采取行动 如果选中复选框,它将提交一个错误的值(即使它预先填充了来自db中现有值的复选标记),我稍后会考虑修复这个问题,但我正在试图找出为什么主动选中的框不绑定到模型。我不知道这是什么交易,因为我的支票盒的帮助看起来正确的基础上,我读过的一切。

    模型

    public class DataSharingModels
    {
        public string ReferenceID { get; set; }
        public NBTC NBTCGroup { get; set; }
        public Contractors ContractorsGroup { get; set; }
        public Coordinators CoordinatorsGroup { get; set; }
        public NGO NGOGroup { get; set; }
        public Public PublicGroup { get; set; }
        public SelectList FA_RA_List { get; set; }
    
    }
    
    public class NBTC
    {
        public Boolean NBTC_FA_Centroid { get; set; }
        public Boolean NBTC_FA_Bound { get; set; }
        public Boolean NBTC_RA_Centroid { get; set; }
        public Boolean NBTC_RA_Bound { get; set; }
        public Boolean NBTC_Spring_Sum { get; set; }
        public Boolean NBTC_Spring_Analysis { get; set; }
        public Boolean NBTC_Spring_Locate { get; set; }
        public Boolean NBTC_Fall_Sum { get; set; }
        public Boolean NBTC_Fall_Analysis { get; set; }
        public Boolean NBTC_Fall_Locate { get; set; }
        public Boolean NBTC_HabMon_Sum { get; set; }
        public Boolean NBTC_HabMon_Analysis { get; set; }
        public Boolean NBTC_HabMon_Locate { get; set; }
        public Boolean NBTC_HabMgmt_Sum { get; set; }
        public Boolean NBTC_HabMgmt_Analysis { get; set; }
        public Boolean NBTC_HabMgmt_Locate { get; set; }
        public Boolean NBTC_Inventory_Sum { get; set; }
        public Boolean NBTC_OpSvy_Sum { get; set; }
        public Boolean NBTC_OpSvy_Individ { get; set; }
    }
    //continues...
    

    @model xxx.Models.DataSharingModels
    
    @using (Html.BeginForm("SetPermission", "DataSharing", FormMethod.Post, new { id = "dShareForm" }))
    {
    <table id="data-sharing-table">
        //a whole bunch of table set up
        <tr>
            <td rowspan="2">CIP Focal Area</td>
            <td>Centroid</td>
            <td><input type="checkbox" name="NBCIStaff" checked disabled /></td>
            <td>@Html.CheckBoxFor(m => m.NBTCGroup.NBTC_FA_Centroid, nbtcAttr)</td>
            <td>@Html.CheckBoxFor(m => m.ContractorsGroup.Contractors_FA_Centroid, contractAttr)</td>
            <td>@Html.CheckBoxFor(m => m.CoordinatorsGroup.Coordinators_FA_Centroid, coordAttr)</td>
            <td>@Html.CheckBoxFor(m => m.NGOGroup.NGO_FA_Centroid, ngoAttr)</td>
            <td>@Html.CheckBoxFor(m => m.PublicGroup.Public_FA_Centroid, publicAttr)</td>
        </tr>
        <tr>
            <td>Boundary</td>
            <td><input type="checkbox" name="NBCIStaff" checked disabled /></td>
            <td>@Html.CheckBoxFor(m => m.NBTCGroup.NBTC_FA_Bound, nbtcAttr)</td>
            <td>@Html.CheckBoxFor(m => m.ContractorsGroup.Contractors_FA_Bound, contractAttr)</td>
            <td>@Html.CheckBoxFor(m => m.CoordinatorsGroup.Coordinators_FA_Bound, coordAttr)</td>
            <td>@Html.CheckBoxFor(m => m.NGOGroup.NGO_FA_Bound, ngoAttr)</td>
            <td>@Html.CheckBoxFor(m => m.PublicGroup.Public_FA_Bound, publicAttr)</td>
        </tr>
        //it continues on like this
    </table>
    <button class="btn btn-default" type="submit">Submit</button>
    }
    

    控制器

    [HttpPost]
    public void SetPermission(DataSharingModels dsm)
    {
        //do stuff
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   MKF    6 年前

    所以问题出在我附加的变量上,我把html属性添加到我的复选框中。我的观点是这样的:

    nbtcAttr = new {@Name = "NBTC"}
    

    这将覆盖使用CheckBoxFor so生成的名称,而不是:

    @Html.CheckBoxFor(m => m.NBTCGroup.NBTC_FA_Centroid) 
    //generates:
    //<input name="NBTCGroup.NBTC_FA_Centroid" data-val:"true" data-val-required:"The NBTC_FA_Centroid field is required" id="NBTCGroup_NBTC_FA_Centroid" type="checkbox" value="true">
    //<input name="NBTCGroup.NBTC_FA_Centroid" type="hidden" value="false">
    

    @Html.CheckBoxFor(m => m.NBTCGroup.NBTC_FA_Centroid, nbtcAttr)
    //generates:
    //<input name="NBTC" data-val="true" data-val-required:"The NBTC_FA_Centroid field is required" id="NBTCGroup_NBTC_FA_Centroid" name="NBTCGroup.NBTC_FA_Centroid" type="checkbox" value="true">
    //<input name="NBTCGroup.NBTC_FA_Centroid" type="hidden" value="false">
    

    注意,在上一个示例中,true和false生成的复选框的名称不匹配。结果发现,模型绑定的过程查找name属性,因此当我更改名称时,它使用了 false 隐藏输入的值,无论是否选中复选框。它只看到了正确的名称(而 true 值的名称不正确),并将该值绑定到模型。

    我所做的不是更改名称,而是添加了一个类,并用它来查找我想要的JS内容中的元素:

    nbtcAttr = new {@class = "NBTC"}