2013-07-01 79 views
0

我使用的捆綁包:ASP.NET MVC3,SQL Server 2012,EF5。當我嘗試將值保存到數據庫中時,我只能保存Book的屬性IsSelected in Books表中的數據庫,StudentName不能保存,並且不能將數據保存到數據庫中的StudentBooks表中,其中包含StudentId和BookId,多少關係,任何想法?ASP.NET MVC3創建多對多

public class CheckboxController : Controller 
{ 
    EFDbContext context = new EFDbContext(ConfigurationManager.ConnectionStrings[1].ConnectionString); 

    // 
    //GET: /Checkbox/ 

    public ActionResult Index() 
    { 
     ViewModelData vmd = new ViewModelData(); 
     List<Book> bookList = new List<Book>(); 

     using (EFDbContext te = new EFDbContext(ConfigurationManager.ConnectionStrings[1].ConnectionString)) 
     { 
      var student = te.Students.First(); 
      vmd.StudentName = student.StudentName; 

      var data = te.Books.ToList(); 
      foreach (var d in data) { 
       Book book = new Book(); 
       book.BookName = d.BookName; 
       book.IsSelected = false; 
       book.BookId = d.BookId; 
       bookList.Add(book); 
      } 
     } 

     vmd.Books = bookList; 

     return View(vmd); 
    } 

    // 
    //GET: /Checkbox/ 

    [HttpPost] 
    public ActionResult Index(ViewModelData vm) 
    { 
     foreach (var book in vm.Books) { 
      context.Books.First(x => x.BookId == book.BookId).IsSelected = book.IsSelected; 
     } 


     context.SaveChanges(); 
     return View(vm); 
    } 
} 

public class ViewModelData 
{ 
    public string StudentName { get; set; } 
    public List<Book> Books { get; set; } 
} 

查看

@model UsingEFNew.Controllers.ViewModelData 

@{ 
    ViewBag.Title = "Example"; 
} 

@using (Html.BeginForm("Index", "Checkbox", null, FormMethod.Post)) 
{ 
<div>Your Name:</div> 
    <div> 
     @Html.TextBoxFor(model => model.StudentName) 
    </div> 

    for (int i = 0; i < Model.Books.Count; i++) { 
    @Html.CheckBoxFor(m => Model.Books[i].IsSelected) 
    @Html.DisplayFor(m => Model.Books[i].BookName) 
    @Html.HiddenFor(m => Model.Books[i].BookId) 
    @Html.HiddenFor(m => Model.Books[i].BookName) 
@:</br> 
} 

}

我的模型

public class Book { 
    public int BookId { get; set; } 
    public string BookName { get; set; } 
    public bool IsSelected { get; set; } 

    public ICollection<Student> Students { get; set; } 
} 

public class Student { 
     public int StudentId { get; set; } 
     public string StudentName { get; set; } 

     public ICollection<Book> Books { get; set; } 
     public ICollection<City> Cities { get; set; } 
    } 
+0

讓我看看你的書籍模型和你的學生模型 – Greg

+0

完成,有什麼想法嗎? – Rakstit

+0

這裏有很多問題。首先,你的ViewModel應該使用一個Student對象,而不僅僅是名字。其次,您在視圖中迭代集合的方式不正確,這就是綁定不正確的原因。給我你的項目,我會修復它。 – Greg

回答

0

在你的[HttpPost]索引你不能從你以學生姓名六ewDataModel並將其推送到任何Student實體中。

[HttpPost] 
public ActionResult Index(ViewModelData vm) 
{ 
    foreach (var book in vm.Books) { 
     context.Books.First(x => x.BookId == book.BookId).IsSelected = book.IsSelected; 
    }   

    var student = context.Students.First(); 
    student.Name = vm.StudentName;//now I've actually changed the student entity and changes will be pushed to database on Save() 

    context.SaveChanges(); 
    return View(vm); 
} 

它看起來並不像你真正利用它們之間的關係。你只需抓住第一個學生,而不是使用從書到學生的關係。我在這裏也做了相同的事情,只是爲了演示將視圖模型中的值映射到實體中。

+0

謝謝你的解決方案,但它只是更新我的Books表並更新我的db中的Students表中的第一行,那不是我所需要的。 – Rakstit

+0

那麼你只能在表單上顯示一個學生姓名,而你只能從數據庫中檢索一個學生姓名。你循環閱讀書籍,但不通過學生。 – AaronLS

+0

最好爲學生設置專門的頁面並顯示編輯鏈接到學生頁面。否則,你會做這樣非常複雜的事情:http://stackoverflow.com/questions/4646340/asp-net-mvc-master-detail-entry-form – AaronLS