1

単一のポストバックでビューモデルを使用して複数行のデータを挿入する方法を見つけようとしています。私はEFとコードファーストのアプローチを使用しています。私が問題を抱えているモデルには、1対多の関係があります。私がやりたいことは、Person が作成されるたびに、Person (異なるテーブル) と共に複数のタスクをデータベースに保存することです。

これまでのところ、すべてではなく最初のタスクしか保存できません。

私のモデルは次のとおりです。

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}

正しい量の番号を受け取りました。ViewModel の使用は比較的一般的だと思っていましたが、チュートリアルやフォーラムで何をしたいのかわかりませんでした....

私の目標は、1 回のポストバックで 1 人あたり複数のタスクを保存できるようにすることです。アドバイスをいただければ幸いです。

4

1 に答える 1

0

ViewModel にはタスクが 1 つしかありません。タスクのリストである必要があります。このようなことをするときは、通常、最初に 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 に答える