【问题标题】:ASP.NET MVC CheckBoxList from model with List Property来自具有 List 属性的模型的 ASP.NET MVC CheckBoxList
【发布时间】:2013-12-19 16:43:34
【问题描述】:

如果标题不清楚,请致歉。

我正在尝试从 ASP.NET MVC 中的表单提交中返回我的模型。

我的问题与this question 几乎相同,不同之处在于我没有List<Model>,而是有这样的模型:

public Model
{
     string UserName {get; set;}
     string Password {get; set;}
     List<Roles> UserRoles {get; set;}
}

我需要 UserRoles 作为复选框,管理员在创建新用户时可以从中选择。我的问题是,我不确定如何对列表使用“@Html.CheckBoxFor”。我试过这个:

 @for (var i = 0; i < Model.UserRoles.Count();i++ )
 {
   @Html.HiddenFor(model => model.UserRoles[i].RoleID)
   @Html.CheckBoxFor(model => model.UserRoles[i].Selected)
   @Html.LabelFor(model => model.UserRoles[i].Name)
 }

这根本不起作用 - 页面上的每个标签都是“名称”,而我的列表在 POST 中是空的。任何人都可以在这方面给我任何指导吗?

【问题讨论】:

标签: c# asp.net-mvc razor


【解决方案1】:

根本不需要离开 Razor。

这对我有用:

for (var i = 0; i < Model.UserRoles.Count(); i++)
{
    var role = Model.UserRoles[i];
    @Html.HiddenFor(model => model.UserRoles[i].RoleId)
    @Html.CheckBoxFor(model => model.UserRoles[i].Selected)
    @Html.LabelFor(model=> model.UserRoles[i].Name, role.Name)
}

【讨论】:

  • 这很好,但只是一个小修正,LabelFor 应该与CheckBoxFor 绑定到相同的东西:@Html.LabelFor(model=&gt; model.UserRoles[i].Selected, role.Name)
  • 'Name' 在发布后没有获得价值
  • 您可以在最后添加@Html.HiddenFor(model => model.UserRoles[i].Name) 以获得发布后的名称值
【解决方案2】:

看下面的代码,这样你就不需要隐藏角色ID,当你为用户保存选择的角色时,你也不需要遍历所有角色来查看选择了哪个角色。

查看

@foreach (Roles info in Model.UserRoles)
{
    <span>
        <input type="checkbox" class="checkbox" name="selectedRoles" value="@info.RoleName" id="@infoRoleName" />
        <label for="@info.RoleName">@info.RoleName</label>
    </span>
}

动作

[HttpPost]
public ActionResult CreateUsers(Model model, string[] selectedRoles)
{
       //
}

【讨论】:

  • 您不需要使用原生 HTML。一个控制器是如何绑定2个模型的?!
  • 我使用了原生 HTML。但是你确实不能绑定两个模型。你不能。你就是不能。你不能。 (我有没有提到你不能)。如果可以的话,它会被称为“MsVC”。
  • 嗨@LiverpoolsNumber9,如果你知道如何解决这个问题,你有没有在 MVC 视图上看到两个提交按钮。你会知道这是如何工作的。
  • 是的,如果你有两个表单,你就有两个动作。不是两个模型。孩子的动作?部分?
【解决方案3】:

从视图中的代码来看,如果您的帖子操作如下所示,帖子应该可以正常工作:

[HttpPost]
public ActionResult Action(Model model)
{
    return View(model);
}

即将您的模型作为参数传递。

还要确保您的模型参考也在视图中:

@model YourNameSpace.Model

【讨论】:

  • DisplayFor 不生成标签 html 元素。
  • @liverpoolsnumber9 好点,我今天睡着了。删除了我答案的那部分。 :)
  • 哈好吧。我同情:)
【解决方案4】:

将复选框列表发布到服务器并获取选中项目列表
linq left join 检查是否选中,生成复选框,收到选中列表

查看

    List<eDurar.Models.tbl_ISOCetificate> ModList = db.tbl_ISOCetificate.ToList();

    var li = (from cert in db.tbl_ISOCetificate join comCert in db.tbl_CompCertificate on cert.Cert_id equals comCert.CompCer_id into jo from b in jo.DefaultIfEmpty()
              select new {cert.Cert_id,cert.Cert_Name,chkd = b.CompCer_SerId==null?"":"checked"}).ToList();


    foreach (var item in li)
    {       
        @:<div style="width: 30%;  display: inline-block; margin: 1em">
        @:<input type="checkbox" @item.chkd name="CheckedCertificates" value="@item.Cert_id">
        @:<label>@item.Cert_Name</label>
        @:</div> 
    }

控制器

  [HttpPost]
    public ActionResult ManageSurveyGroup(int[] CheckedCertificates)
    {
        return View();
    }

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多