i'm new in asp.net MVC and I/m use view model to poppulate the dropdown list and group of checkboxes. I use SQL Server 2012, where have many to many relationships between Students - Books; Student - Cities. I need collect StudentName, one city and many books for one student.
I have next questions:
1. How can I get the values from database to my StudentBookCityViewModel?
2. How can I save the values to my database in [HttpPost] Create method?
Here is the code:
MODEL
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; }
}
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 City {
public int CityId { get; set; }
public string CityName { get; set; }
public bool IsSelected { get; set; }
public ICollection<Student> Students { get; set; }
}
VIEW MODEL
public class StudentBookCityViewModel {
public string StudentName { get; set; }
public IList<Book> Books { get; set; }
public StudentBookCityViewModel()
{
Books = new[]
{
new Book {BookName = "Title1", IsSelected = false},
new Book {BookName = "Title2", IsSelected = false},
new Book {BookName = "Title3", IsSelected = false}
}.ToList();
}
public string City { get; set; }
public IEnumerable<SelectListItem> CityValues
{
get
{
return new[]
{
new SelectListItem {Value = "Value1", Text = "Text1"},
new SelectListItem {Value = "Value2", Text = "Text2"},
new SelectListItem {Value = "Value3", Text = "Text3"}
};
}
}
}
Context
public class EFDbContext : DbContext{
public EFDbContext(string connectionString) {
Database.Connection.ConnectionString = connectionString;
}
public DbSet<Book> Books { get; set; }
public DbSet<Student> Students { get; set; }
public DbSet<City> Cities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Book>()
.HasMany(x => x.Students).WithMany(x => x.Books)
.Map(x => x.MapLeftKey("BookId").MapRightKey("StudentId").ToTable("StudentBooks"));
modelBuilder.Entity<City>()
.HasMany(x => x.Students).WithMany(x => x.Cities)
.Map(x => x.MapLeftKey("CityId").MapRightKey("StudentId").ToTable("StudentCities"));
}
}
Controller
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create()
{
//I don't understand how I can save values to db
context.SaveChanges();
return RedirectToAction("Index");
}
View
@model UsingEFNew.ViewModels.StudentBookCityViewModel
@using (Html.BeginForm())
{
Your Name:
@Html.TextBoxFor(model = model.StudentName)
<div>Genre:</div>
<div>
@Html.DropDownListFor(model => model.City, Model.CityValues)
</div>
<div>Books:</div>
<div>
@for (int i = 0; i < Model.Books.Count; i++)
{
<div>
@Html.HiddenFor(x => x.Books[i].BookId)
@Html.CheckBoxFor(x => x.Books[i].IsSelected)
@Html.LabelFor(x => x.Books[i].IsSelected, Model.Books[i].BookName)
</div>
}
</div>
<div>
<input id="btnSubmit" type="submit" value="Submit" />
</div>
</div>
}