如何在EF MVC中使用父对象和子对象列表来发布和捕获视图模型?

时间:2017-03-18 03:44:53

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

我想添加系列,其中包含许多成员,并且可以拥有多个住宅。我正在尝试创建一个表单并使用其他对象的集合提交对象系列。我尝试了一些东西,但我只能将一个对象传递给控制器​​而不是集合。我该怎么办? 我应该制作成员并容纳部分观点并在视图中呈现它们吗? 有没有办法用JavaScript收集所有内容然后将整个系列对象传递给控制器​​?
我正在使用MVC 5和Entity Framework。我无法解决这个问题。任何帮助表示赞赏。

这是一个对象的例子

public class family
{

    public int id { get; set; }
    public int familyname { get; set; }
    public List<member> members { get; set; }
    public List<house> houses { get; set; }
}

public class member
{
    public int id { get; set; }
    public string name { get; set; }
    public DateTime birthdate { get; set; }

    //foreign key
    public family Family { get; set; }
    public int FamilyID { get; set; }
}

public class house
{

    public int id { get; set; }
    public int number { get; set; }
    public string address { get; set; }
    //foreign key
    public family Family { get; set; }
    public int FamilyID { get; set; }
}

public class FamilyViewModel
{
   public family Family { get; set; }
    public member Member { get; set; }
    public house House { get; set;}
    public List<member> Members { get; set; } //??
    public List<house> Houses { get; set; } //??
}

查看

@model WebApp.ViewModels.FamilyViewModel
@{
    ViewBag.Title = "New";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Family</h2>
@using (Html.BeginForm("Submit", "Family"))
{
    <div class="form-group">
      @Html.LabelFor(m => m.Family.familyname)
      @Html.TextBoxFor(m => m.Family.familyname, new { @class = "form-control"})
    </div>
    <div id="member">
    </div>
    <div id="house">
    </div>
}

控制器

    [HttpPost]
    public ActionResult Submit(FamilyViewModel CompleteFamily)
    {
        //What to do here?

        return View();
    }

1 个答案:

答案 0 :(得分:0)

首先,请在家庭班级内将 familyname 的数据类型更改为 string FamilyViewModel 与您的系列类相同。

目前,我正在开发具有此类功能的MVC项目。在这种情况下,请参阅首先,您需要为系列保存数据。保存时,成员房屋 null 。 例如,第一次保存数据时,假设此处的family id为1,familyname为John,member和houses为null。 希望你明白这一点。

您已经为会员和住宅渲染了两个局部视图。在主视图中提供两个按钮(这只是您的家庭视图)。 1表示添加成员,另1表示添加成员。因此,当用户单击“添加成员”时,会显示一个弹出模式或任何您想要的内容,用户可以在其中提交家庭成员。同样适用于房屋。

然后在保存家庭成员时(我的意思是当他们点击成员弹出模式中的SAVE按钮时),只需调用jquery / ajax函数并将数据发布到控制器方法,包括当前的系列ID

请参阅我的吼叫代码,

//这将在成员的弹出模式中,

<div class="row with-forms">
 <div class="col-md-12">
   <h5>Member Name</h5>
    <input class="search-field" type="text" name="name" id="memberName" />
  </div>
  <div class="col-md-12">
    <h5>Birth Date</h5>
    <input class="search-field" type="text" name="DOB" id="memberDOB" />
  </div>  
  <div class="col-md-12">
    <input class="btn btn-success" type="button" id="saveMembers" />
  </div>                       
</div>

//我的jquery / ajax代码来保存成员数据

$("#saveMembers").click(function () {
  var membersData = [{
         name: $("#memberName").val(),
         birthdate: $("#memberDOB").val()                   
       })
  var CompleteFamily = {
                id: $("#hiddenFamilyId").val(), //keep your familyId in a 
                                                //hidden field in same page
                members: membersData,
                //houses: houseData //similarly u can add house data here
            }
  $.ajax({
          "url": "/yourControllerName/FamilyViewModel",
           "type": "Post",
           "data": CompleteFamily,
           success: function (data) {
            //show a message that member added to this family
           }
         })

多数民众赞成。然后,您可以在Action方法中保存数据。像这样你可以用相同的ajax方法为同一个familyId发布房屋数据。

在您的控制器操作方法中,您可以像这样进行验证,

public ActionResult Submit(FamilyViewModel CompleteFamily)
{
 if(FamilyViewModel.id == 0)
   // This is a new entry to family.
   // Return your new familyId in a viewBag and keep that in a hidden field 
   //in your view HTML
 else
   {
     //You just need to update the family. I mean, here you are adding 
     //members and houses to the respective family Id.
   }
 }

请注意,不要忘记在viewBag或您想要的任何内容中返回您的familyId,并将其保存在HTML中的隐藏字段中。因此,只有您可以将成员/房屋添加到相应的Id。就像我在上面的ajax中传递数据一样。

例如,您的familyId在HTML中如下,

<input type="hidden" id="hiddenFamilyId" value="@ViewBag.familyId"/>

希望它能解决你的问题。干杯...