CheckBox для не привязки к модели - PullRequest
0 голосов
/ 04 октября 2018

Мое приложение работает так: пользователь выбирает проект из выпадающего списка и загружает частичное представление.Действие контроллера, которое возвращает частичное представление, извлекает данные из базы данных и устанавливает флажки в частичном представлении значениями, которые существуют в базе данных.Для этого, очевидно, модель возвращается с частичным представлением.Это работает просто отлично.

Теперь, если пользователь изменит значение флажка и снова отправит форму, я предположил, что новые значения флажков будут привязаны к модели и, таким образом, я смогуиспользуйте его для обновления базы данных новыми значениями.К сожалению, все возвращается как «ложь», даже если флажок установлен.Я понимаю, что если не предпринимать никаких действий над флажком, он отправит ложное значение (даже если оно было предварительно заполнено галочкой из существующего значения в БД), я буду беспокоиться об исправлениипозже, но я пытаюсь выяснить, почему флажки, которые активны, не привязаны к модели.Я не уверен, в чем дело, поскольку мои помощники 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
}

1 Ответ

0 голосов
/ 04 октября 2018

Получается, что проблема была в переменных, которые я прикреплял для добавления 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"}
...