【问题标题】:How to HTTPPost ASP.Net MVC 5 CheckBoxList to database如何 HTTPPost ASP.Net MVC 5 CheckBoxList 到数据库
【发布时间】:2015-02-04 18:06:36
【问题描述】:

我无法从复选框列表中获取要发布到我的数据库表的值。这是我的模型:

public partial class SecurityChange_Access
{
    public int ID { get; set; }
    public string Access_Name { get; set; }
    public bool IsSelected { get; set; }
}

public partial class Change
{
    public int ID { get; set; }
    public string Emp_FirstName { get; set; }
    public string Emp_LastName { get; set; }
    public string Emp_Supervisor { get; set; }
    public string Emp_MangerEmail { get; set; }
    public string Emp_MirrorAccount { get; set; }
    public string Security_Change_Access { get; set; }

    public List<SecurityChange_Access> SecurityAccessList { get; set; }

    public bool addAccess { get; set; }
    public IEnumerable<SelectListItem> ChangeRadioList { get; set; }

    //[Required(ErrorMessage = "You must select an option for TestRadio")]
    public String ChangeRadio { get; set; }
}

public class bTest
{
    public int ID { get; set; }
    public string Name { get; set; }
}

这里是 HTTPGet 和 HTTPPost:

[HttpGet]
public ActionResult Change(Change change)
{   
    List<bTest> list = new List<bTest>();
    list.Add(new bTest() { ID = 1, Name = "Add Access" });
    list.Add(new bTest() { ID = 2, Name = "Remove Access" });
    list.Add(new bTest() { ID = 3, Name = "Change Access" });
    SelectList sl = new SelectList(list, "Name", "Name");
    change.ChangeRadioList = sl;

    List<ActiveDirectory> objadlist = (from data in       objentity.ActiveDirectories select data).ToList();
    ActiveDirectory objAD = new ActiveDirectory();
    objAD.displayName = "";
    objAD.mail = "";
    objAD.Id = 0;
    objadlist.Insert(0, objAD);
    SelectList objmodeldata = new SelectList(objadlist, "displayName", "displayName", 0);
    /*Assign value to model*/
    change.ADList = objmodeldata;

    change.SecurityAccessList = new List<SecurityChange_Access>();
    change.SecurityAccessList = BindSecurity();

    return View(change);
}

public List<SecurityChange_Access> BindSecurity()
{
    List<SecurityChange_Access> _objsecurity = (from data in _entities.SecurityChange_Access select data).ToList();
    return _objsecurity;
}

[HttpPost]
public ActionResult Change([Bind(Include = "ID, Emp_FirstName, Emp_LastName, Emp_Supervisor, Emp_MangerEmail, Emp_MirrorAccount, Security_Change_Access, Security_Access_To_1, Security_Access_To_2, Security_Access_To_3, Security_Access_To_4, Security_Access_To_5, Security_Access_To_6, Security_Access_To_7, Security_Access_To_8, Security_Access_To_9, Security_Access_To_10, Security_Access_To_Other, Security_Access_ADF_Mirror, Security_Access_JDE_Mirror, Security_Access_NetworkDrives_1, Security_Access_NetworkDrives_2, Security_Access_NetworkDrives_3, Security_Access_NetworkDrives_4, Security_Access_NetworkDrives_5, Security_Access_NetworkDrives_6, Security_Access_NetworkDrives_7, Security_Access_NetworkDrives_8, Security_Access_NetworkDrives_9, Security_Access_NetworkDrives_10, Security_Access_NetworkDrives_11, Security_Access_NetworkDrives_12, Security_Access_NetworkDrives_13, Security_Access_NetworkDrives_14, Security_Access_NetworkDrives_15, Security_Access_NetworkDrives_16, Security_Access_NetworkDrives_17, Security_Access_NetworkDrives_18, Security_Access_NetworkDrives_19, Security_Access_NetworkDrives_20, Security_Access_NetworkDrives_21, Security_Access_NetworkDrives_22, Security_Access_NetworkDrives_23, Security_Access_NetworkDrives_24, Security_Access_NetworkDrives_25, Security_Access_NetworkDrives_26, Security_Access_NetworkDrives_27, Security_Access_NetworkDrives_28, Security_Access_NetworkDrives_29, Security_Access_NetworkDrives_30, IT_Equipment_1, IT_Equipment_2, IT_Equipment_3, IT_Equipment_4, IT_Equipment_5, IT_Equipment_6, IT_Equipment_7, IT_Equipment_8, IT_Equipment_9, IT_Software_1, IT_Software_2, IT_Software_3, IT_Software_4, IT_Software_Other, IT_Media_1, IT_Media_2, IT_Media_3, IT_Media_Other, IT_Other_Equipment, Additional_Information")] Change change, int? id)
{
    try
    {
        if (ModelState.IsValid)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECTED COUNTRY :- ").AppendLine();
            foreach (var item in change.SecurityAccessList)
            {
                if (item.IsSelected == true)
                {
                    sb.Append(item.Access_Name + ", ").AppendLine();
                    _entities.Changes.Add(change);
                    _entities.SaveChanges();

                    return RedirectToAction("Change");
                }
            }

        }

    }
    catch (System.Data.Entity.Validation.DbEntityValidationException ex)
    {
         foreach (var e in ex.EntityValidationErrors)
        {
            //check the ErrorMessage property
        }
    }
    return View(change);
}

这是 Razor 代码:

<table border="0" width="1000" cellpadding="5" cellspacing="5">
    @for (int i = 0; i < Model.SecurityAccessList.Count; i++)
    {
        <tr>
            <td width="200">
                @Html.CheckBoxFor(m => Model.SecurityAccessList[i].IsSelected)
                @Model.SecurityAccessList[i].Access_Name
                @Html.HiddenFor(m => Model.SecurityAccessList[i].ID)
                @Html.HiddenFor(m => Model.SecurityAccessList[i].Access_Name)
            </td>
        </tr>
    }

在我的 HTTPGET 中,我绑定了我的列表,但是我需要将我的列表发布到检查的值上。我不知道该怎么做。我在获取检查列表时也遇到了问题,因此它以逗号分隔。我似乎无法在网上找到任何可以帮助我解决这个问题的东西。我似乎无法将数据发布到 Security_Change_Access 字段。

【问题讨论】:

  • 尝试在 Change 类中初始化 SecurityAccessList,例如: public partial class Change { public Change() { ChangeRadioList = new List(); } // 其余属性 }

标签: c# asp.net asp.net-mvc entity-framework http-post


【解决方案1】:

首先,不要将复杂对象作为参数传递给 GET 方法。复杂对象或集合的属性不会绑定(它们将为空),您可能会超过查询字符串限制(使您的应用程序崩溃),然后它会创建丑陋的 url。只需在方法中初始化一个新的Change,或者传递一个ID,然后根据ID得到Change

虽然我建议您使用与复选框相关联的标签,但您的视图代码看起来不错,而且 Access_Name 属性的隐藏输入似乎没有必要

@for (int i = 0; i < Model.SecurityAccessList.Count; i++)
{
  @Html.CheckBoxFor(m => m.SecurityAccessList[i].IsSelected)
  @Html.LabelFor(m => m.SecurityAccessList[i].IsSelected, Model.SecurityAccessList[i].Access_Name)
  @Html.HiddenFor(m => m.SecurityAccessList[i].ID)
}

应该生成带有name属性的html

<input type=checkbox" name="SecurityAccessList[0].IsSelected" ...>
<input type=checkbox" name="SecurityAccessList[1].IsSelected" ...>

接下来,删除(糟糕的)[Bind] 属性。默认情况下,所有属性都是绑定的,这似乎是您想要做的,但实际上您已经排除了SecurityAccessList(我认为 - tl;dr)并包含了很多甚至不存在的“属性”在您的模型中 (Security_Access_To_1, Security_Access_To_2, .....)。如果您发现自己需要使用 [Bind(Include="..")],请停止并使用视图模型来显示/编辑您需要的内容。

POST 方法应该正确地将您的模型与包含集合的change.SecurityAccessList 绑定。注意我建议您将参数更改为(例如)model。在这种情况下它没问题,但是关于绑定失败的问题很多,因为参数的名称与模型属性的名称匹配。

旁注:

您创建SelectListList&lt;bTest&gt; list = new List&lt;bTest&gt;(); 位似乎在单选按钮列表中使用似乎很奇怪。选择列表甚至不适合这种用法,在任何情况下,您甚至都不使用bTestID 属性。也可能是

SelectList sl = new SelectList(new List<string>() { "Add Access", "Remove Access", "Change Access" });

产生完全相同的结果,尽管我怀疑您所需要的只是List&lt;string&gt;的属性

接下来的ActiveDirectory objAD = new ActiveDirectory(); 位,您似乎在其中插入“默认”或null 项目以用于选择列表也是错误的。同样,您使用的唯一属性是displayName,但无论如何删除它并使用接受optionLabelDropDownListFor() 的重载

@Html.DropDownListFor(m => m.YourProperty, Model.ADList, "-Please select-")

这添加了一个null 选项&lt;option value&gt;-Please Select-&lt;/option&gt;,可以与[Required] 属性关联使用。

最后是 if (ModelState.IsValid) 块内的代码,这是没有意义的。您甚至不使用sb 的值(不确定它的用途),然后每次IsSelected=true 都尝试将change 的相同实例添加到数据库中,除了它只添加一次,因为添加后,您会立即进行重定向。

【讨论】:

  • 好的,我可以检索我的复选框列表,但现在我在将逗号分隔值发布到另一个表时遇到问题。我该怎么做。我想要的只是将数据发布回列中的更改模型。我似乎无法理解如何将值发回数据库。
  • 这很容易做到,但问题是为什么?您不应该将逗号分隔的值存储在数据库中以表示关系(如果您存储了一个用 [Flags] 属性修饰的 enum 值,则唯一适用的情况)。然后当然你需要在读取数据时再次解析它。很难准确理解您对 tos 代码所做的事情,但我怀疑您需要一个包含 employeeIDSecurityAccessListIDSecurityAccessListName 字段的表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多