我的应用程序的工作方式如下:用户从下拉列表中选择一个项目,并加载部分视图。返回部分视图的控制器操作从数据库中提取数据,并使用数据库中存在的值填充部分视图中的复选框。为此,很明显,模型会返回局部视图。一切正常。
现在,如果用户更改复选框的值并再次提交表单,则我认为复选框的新值将绑定到模型,因此,我可以使用它来用新值更新数据库。不幸的是,即使选中该复选框,所有内容也将返回“ false”。我确实知道,如果对复选框未执行任何操作,则会提交错误的值(即使它已预先填充了数据库中现有值的选中标记),我也会担心自己稍后进行修复,但我试图弄清楚为什么主动检查的框未绑定到模型。我不确定这是怎么回事,因为根据我阅读的所有内容,我的CheckBoxFor助手看起来正确无误。
模型
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
}
答案 0 :(得分:0)
所以事实证明问题出在我附加的变量上,这些变量是用来将html属性添加到我的复选框的。我认为这样的事情:
nbtcAttr = new {@Name = "NBTC"}
这会覆盖使用CheckBoxFor生成的名称,而不是:
@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"}