1

我试图弄清楚如何使用带有单个回发的视图模型插入多行数据。我正在使用 EF 和代码优先方法。我遇到问题的模型具有一对多的关系。我想做的是,每当创建一个人时,应该将多个任务与一个人(不同的表)一起保存到数据库中。

到目前为止,我只能保存第一个任务而不是全部。

我的模型是:

public class Person
{
    public Person()
    {
        this.Tasks = new List<Task>();
    }

    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Task> Tasks { get; set; }
}

public class Task
{
    [key]
    public int ID { get; set; }
    public int PersonID { get; set; }
    public string Task { get; set; }

    public virtual Person Person { get; set; }
}

视图模型:

    Public class PersonData
    {
       public Person Person { get; set; }
       public Task Task { get; set; }
    }

看法:

    @model Project.ViewModels.PersonData

    @using (Html.BeginForm()) {
       @Html.ValidationSummary(true)

       <fieldset>
       <legend>Event</legend>

       <div>
           @Html.TextBoxFor(model => model.Event.Name)
       </div>
       <div id="taskdiv">
       </div>
       @*dynamically generated textboxes here*@

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    </fieldset>

    <script type="text/javascript">
    // took few codes out here, but whats happening here is based on int value textboxes for Task appears
    for (var i = 1; i <= $count; i++) {
        $('#taskdiv').append('<div><label>Task #' + i + ' </label>@Html.TextBoxFor(model => model.Task.Task)</div>');
    }

控制器:

    public class PersonController : Controller
    {
       private Context db = new DBContext();

    public ActionResult Create()
    {
       return View();
     }

     [HttpPost]
     public ActionResult Create(ViewModels.PersonData personData) 
    {           
       if (ModelState.IsValid) 
        {
           db.Person.Add(eventData.Person);
           db.Tasks.Add(eventData.Task);
           db.SaveChanges();        

           return RedirectToAction("Index");
        }
        return View();
    }

至少我知道任务正在通过。我尝试了几件事

foreach (char c in personData.Task.Task.AsEnumerable)
{ count += 1}

并收到正确数量的号码。我认为使用 ViewModels 是比较常见的,但我没有看到我想在任何教程或论坛中做什么......

我的目标是能够通过一次回发为每个人保存多项任务。任何建议将被认真考虑!

4

1 回答 1

0

在您的 ViewModel 中,您只有一个任务,应该是任务列表吧?当我做这样的事情时,我通常先保存 Person 对象,然后使用 ajax 向它添加任务。

该方法可能看起来像这样。

public void SaveTasks(List<Task> tasks){
    //important that tasks already have personId --set on client side

    foreach(var task in Tasks){
      //do some validation
      db.Tasks.Add(task);
    }
    db.SaveChanges();

}
于 2013-04-11T07:12:46.380 回答