我试图弄清楚如何使用一个视图模型插入多行数据与一个回发。我使用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; }
}
ViewModel:
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是比较常见的,但我没有看到我想在任何教程或论坛....
我的目标是能够用一次回发保存每个人的多个任务。任何建议将不胜感激!
在你的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();
}