2013-07-01 6 views
0

나는 ASP.NET MVC3, SQL Server 2012, EF5를 사용하고 있습니다. 내 데이터베이스에 값을 저장하려고하면 내 책의 책 테이블에서 IsSelected라는 책의 속성 만 저장할 수 있고 StudentName은 저장되지 않고 Studentbook과 BookId가 포함 된 StudentBooks 테이블에 저장된 데이터를 저장할 수 없습니다. - 많은 관계, 어떤 아이디어?ASP.NET MVC3 many-to-many 만들기

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> 
} 

}

내 모델 당신의 [HttpPost] 인덱스에서

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

당신은 당신에서 학생 이름을하지 않는 Vi 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

고맙다. 솔루션을 가져 주셔서 감사합니다.하지만 내 책 테이블을 업데이트하고 학생 테이블의 첫 번째 행을 업데이트해야합니다. – Rakstit

+0

글씨체에는 단 하나의 학생 이름 만 표시되며 데이터베이스에서 단 하나의 학생 이름 만 검색 할 수 있습니다. 책을 반복하지만 학생들은 반복하지 않습니다. – AaronLS

+0

학생 전용 페이지가 있고 학생 페이지에 수정 링크가 표시되는 것이 가장 좋습니다. 그렇지 않으면 다음과 같이 매우 복잡한 작업을 수행하게 될 것입니다. http://stackoverflow.com/questions/4646340/asp-net-mvc-master-detail-entry-form – AaronLS