0

私はasp.net MVCの初心者で、ビューモデルを使用してドロップダウンリストとチェックボックスのグループを設定しています。私は SQL Server 2012 を使用しています。ここでは、学生と書籍の間に多対多の関係があります。学生 - 都市。StudentName、1 つの都市、1 人の学生のために多くの本を集める必要があります。

次の質問があります:
1.データベースから StudentBookCityViewModel に値を取得するにはどうすればよいですか?
2. [HttpPost] Create メソッドで値をデータベースに保存するにはどうすればよいですか?

コードは次のとおりです。

モデル

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

モデルを見る

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

環境

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"));
    }
}

コントローラ

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");
    }

意見

@model UsingEFNew.ViewModels.StudentBookCityViewModel

@using (Html.BeginForm())
{
    <div id="ContactContainer">
        <div>Your Name:</div>
        <div>
            @Html.TextBoxFor(model => model.StudentName)
        </div>

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

1 に答える 1

2

コントローラーで直接dbから値を取得できます

    public ActionResult Create()
        {
                var vm = new StudentBookCityViewModel();
                using(var ctx = EFDbContext(connectionString))
                {
                var student = ctx.Students.First();
                vm.StudentName=student.Name;
    vm.Books = student.Books.ToList(); //make sure to call ToList() to load values from db
    ...
                }
                return View(vm);
            }
        [HttpPost]
    public ActionResult Create(StudentBookCityViewModel model)
    {

        //I don't understand how I can save values to db

        //here you have the model with all infomation from the form
       foreach(var book in model.Books){
        context.Books.First(b=>b.BookId == book.BookId).IsSelected = book.IsSelected;
}
        context.SaveChanges();

        return RedirectToAction("Index");
    }
于 2013-07-01T15:41:21.153 に答える