在一个视图中创建主从

Master-Detail created in one View

我有一个带子模型的模型。

 [Table("Personnel")]
public class Personnel
{
  [Key]
  public int Id { get; set; }

  [MaxLength(10)]
  public string Code { get; set; }

  [MaxLength(20)]
  public string Name { get; set; }
  public virtual List<PersonnelDegree> Degrees
  {
        get;
        set;
  }

}
public class PersonnelDegree
{
 [Key]
 public int Id { get; set; }

 [ForeignKey("Personnel")]
 public int PersonnelId { get; set; }
 public virtual Personnel Personnel { get; set; }

 [UIHint("Enum")]
 public Degree Degree { get; set; }

 public string Major { get; set; }

 public string SubField { get; set; }

 public string Location { get; set; }
}

我想为此创建一个视图。(添加)

我添加了pesonnel字段来查看,但是如何为PersonnelDegree添加项目?

  @using (Html.BeginForm("Add", "Personnel", FormMethod.Post, new {enctype = "multipart/form-data", @class = "form-horizontal tasi-form", id = "default"}))
    {
      @Html.AntiForgeryToken()
      @Html.ValidationSummary(true, null, new {@class = "alert  alert-danger "})

   <div class="form-group">
    @Html.LabelFor(m => m.Code, new {@class = "control-label col-lg-1"})
    <div class="col-lg-3">
    @Html.TextBoxFor(m => m.Code, null, new {@class = "form-control", maxlength = 10})
    @Html.ValidationMessageFor(m => m.Code)
    </div>
    </div>
    <div class="form-group">
    @Html.LabelFor(m => m.Name, new {@class = "control-label col-lg-1"})
    <div class="col-lg-3">
    @Html.TextBoxFor(m => m.Name, new {@class = "form-control", maxlength = 20})
    @Html.ValidationMessageFor(m => m.Name)
    </div>
    @Html.LabelFor(m => m.Family, new {@class = "control-label col-lg-1"})
    <div class="col-lg-3">
    @Html.TextBoxFor(m => m.Family, null, new {@class = "form-control", maxlength = 30})
    @Html.ValidationMessageFor(m => m.Family)
    </div>
    </div>

我可以在此视图中添加多个 PersonnelDegrees 吗?

编辑

我在度数视图中添加了一个 div

 <div id="Degrees">
  <div id="NewDegree" style="display:none">
  <div class="form-group">
    <input class="form-control" id="Degrees[#].Major"   name="Degrees[#].Major" value="" type="text">
          // another items                             
  </div>
  </div>
 </div>

并在 javascript 中:

$(document).ready(function() {
        $(function() {
            $("#addItem").click(function () {
                var index = $('#Degrees tbody tr').length; // assumes rows wont be deleted
                var clone = $('#NewDegree').html();
                // Update the index of the clone
                clone.replace(/\[#\]/g, '[' + index + ']');
                clone.replace(/"%"/g, '"' + index + '"');
                $('#Degrees').append(clone);
            });


        );
    });

它添加了一个div,但几秒钟后隐藏div并刷新页面。

是的,你可以。有几种方法可以选择:

使用Js类网格组件

使用一些 js 网格组件,我更喜欢 jqgrid 你可以用它在你的 View 上本地添加数据,然后在表单 [=70 上序列化它=] 到控制器。

优点:你不需要自己用你的网格编写 js CRUD 操作,你唯一应该得到的是如何以正确的方式将本地数据序列化到控制器。

缺点:您应该了解组件的工作原理,并且可能是某些组件在 MVC 项目中不容易实现(我的意思是您可能会丢失模型验证、数据注释等)客户端)

使用 js 添加标记

编写您自己的 js 来解决此问题。 Here 是一个很好的基本示例,说明如何操作。您使用 js(从控制器获取 js)生成 html 并将其添加到您的视图的想法。

优点:你可以做任何你想做的事情,只要你懂js。

缺点:您在客户端丢失了模型验证、数据注释等。

在 js 中使用 PartialView

使用 AjaxController 获取标记(PartialView 用于您的 PersonnelDegree)并将其附加到您的 View 与 js.

优势:您可以利用所有 ViewModel 优势 (DataAnnotations),此外您还可以在 CRUD 控制器方法,如果你需要的话。如果您的项目很大并且失去生命周期,它也是最容易维护的解决方案。

缺点: 您应该学习如何在标记来自 ajax 调用时初始化客户端验证。通常这种方法也会迫使您编写大量代码。

如果我有时间,我更喜欢最后一个选项。

您可以使用部分视图为人事学位添加项目。要在此视图中添加多个人员学位,您需要在控制器中创建对象

        Personnel pers = new Personnel(); 
        PersonnelDegrees pr_obj = new PersonnelDegrees ();
        ind_obj.PersonnelDegrees .Add(pr_obj );
        PersonnelDegrees pr_obj1 = new PersonnelDegrees ();
        ind_obj.PersonnelDegrees .Add(pr_obj1 );