簡體   English   中英

CheckBoxFor不綁定到模型

[英]CheckBoxFor not binding to model

我的應用程序的工作方式如下:用戶從下拉列表中選擇一個項目,並加載部分視圖。 返回部分視圖的控制器操作從數據庫中提取數據,並使用數據庫中存在的值填充部分視圖中的復選框。 為此,很明顯,模型會返回局部視圖。 這很好。

現在,如果用戶更改復選框的值並再次提交表單,則我認為復選框的新值將綁定到模型,因此,我可以使用它來用新值更新數據庫。 不幸的是,即使選中該復選框,所有內容也將返回“ false”。 我確實知道,如果對復選框未采取任何措施 ,它將提交錯誤的值(即使它已預先填充有數據庫中現有值的選中標記),我也會擔心以后要解決此問題,但是我會m試圖找出為什么主動選中的框未綁定到模型的原因。 我不確定這是怎么回事,因為根據我讀過的所有內容,我的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
}

所以事實證明問題出在我附加的變量上,這些變量是用來將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"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM