C#实体概述一对多复选框表

时间:2015-04-01 08:55:28

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

我似乎无法找到如何为一对多复选框构建正确的解决方案。

那么我有什么:

我有一篇文章,管理员用户可以设置该文章的用户权限。 所以在我的文章右页中,您可以看到所有用户的概述。

我的文章:

public partial class Artikel
    {
        public Artikel()
        {
            this.ArtikelLinks = new HashSet<ArtikelLink>();
            this.ArtikelRights = new HashSet<ArtikelRight>();
        }

        public int id { get; set; }
        public string code { get; set; }
        public string naam { get; set; }

        public virtual ICollection<ArtikelLink> ArtikelLinks { get; set; }
        public virtual ICollection<ArtikelRight> ArtikelRights { get; set; }
    }

我的权利类

 public partial class ArtikelRight
    {
        public int id { get; set; }
        public System.Guid userId { get; set; }
        public int artikelId { get; set; }
        public bool hasRight { get; set; }

        public virtual Artikel Artikel { get; set; }
    }

如何构建我的视图?我试过几种方法,但我似乎无法保存我的数据。 这是我目前的权利观点:

@using (Html.BeginForm()) {
        <table width="90%" align="center" class="table table-striped">
            <thead>
                <tr> 
                    <th align="left">Gebruiker</th> 
                    <th align="left">Heeft toegang</th> 
                </tr>
            </thead> 
               @Html.EditorFor(x => Model.ArtikelRights, "ArtikelRight")
        </table>

        <br />
        <div class="pull-right">
            <input type="submit" value="Opslaan" class="btn btn-sm beige" />
        </div>
}

这是我的部分Artikel正确观点:

@model IEnumerable<GtiProducts.Models.ArtikelRight>


@foreach (var item in Model) { 
    <tr>
        <td>
            @Membership.GetUser(item.userId).UserName
        </td>
        <td>
            @Html.EditorFor(x => item.hasRight)

        </td>
    </tr>
}

我的保存操作是:

public ActionResult Rights(Artikel art)
{

    repo.SaveChanges();
    return View(art);
}

当我调试我的艺术时.ArtikelRights为空。 我如何解决这个问题以及使用实体框架实现这一目标的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:0)

重命名部分以使其成为EditorTemplate - /Views/Shared/EditorTemplates/ArtikelRight.cshtml,然后进行以下修改

@model GtiProducts.Models.ArtikelRight // not IEnumerable
<tr>
  <td>
    @Html.CheckBoxFor(m => m.hasRight)</td>
    @Html.LabelFor(m => m.hasRight, "....") // the users name?
    @Html.HiddenFor(m > m.id) // or what ever property you need to identify the ArtikelRight.cshtml
  </td>
</tr>

然后在主视图中

<tbody>
  @Html.EditorFor(x => Model.ArtikelRights)
</tbody>

这将使用索引器正确命名控件,以便它们可以在回发时绑定到您的模型,例如

<input type="checkbox" name="ArtikelRights[0].hasRight" ...>
<input type="checkbox" name="ArtikelRights[1].hasRight" ...>

附注:您不应在视图中使用@Membership.GetUser(item.userId).UserName。而是创建一个视图模型,其中仅包含视图中所需的属性(看起来是idhasright,并包含用户显示名称的属性(并在控制器中填充它)。 / p>