多対多の関係のために MVC で MultiSelectLists を作成するための優れた使いやすいソリューションを探しています。
私はこの次のサンプルコードを持っていますが、うまく動作しますが、コードがたくさん必要です。将来のプロジェクトで MultiSelectLists を簡単に作成できるように、コードを短く、スマートに、または何らかの方法でジェネリックにすればクールです..
これが私がやった方法です(空想的なものはありません)
Entity Framework Code First を使用したマイ データベース: 書籍、および著者 (1 つの書籍に複数の著者を含めることができます)。
public class DataContext : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Author> Authors { get; set; }
}
public class Book
{
public int Id { get; set; }
public string Name { get; set; }
//Allows multiple authors for one book.
public virtual ICollection<Author> Authors { get; set; }
}
public class Author
{
public int Id { get; set; }
public string Name { get; set; }
[NotMapped]
public int[] SelectedBooks { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
コントローラ
public ActionResult Edit(int id = 0)
{
Author author = db.Authors.Find(id);
if (author == null)
{
return HttpNotFound();
}
ViewData["BooksList"] = new MultiSelectList(db.Books, "Id", "Name", author.Books.Select(x => x.Id).ToArray());
return View(author);
}
[HttpPost]
public ActionResult Edit(Author author)
{
ViewData["BooksList"] = new MultiSelectList(db.Books, "Id", "Name", author.SelectedBooks);
if (ModelState.IsValid)
{
//Update all the other values.
Author edit = db.Authors.Find(author.Id);
edit.Name = auther.Name;
//------------
//Make adding items possible
if (edit.Books == null) edit.Books = new List<Book>();
//Remove the old, add the new, instead of finding out what to remove, and what to add, and what to leave be.
foreach (var item in edit.Books.ToList())
{
edit.Books.Remove(item);
}
foreach (var item in author.SelectedBooks)
{
edit.Books.Add(db.Books.Find(item));
}
//-------------
// This is the code i want to simplify
// Would be cool with a generic extention method like this:
// db.ParseNewEntities(edit.Books, author.SelectedBooks);
// I just don't know how to code it.
db.SaveChanges();
return RedirectToAction("Index");
}
return View(author);
}
意見
@Html.ListBox("SelectedBooks",(MultiSelectList)ViewData["BooksList"])
これを適切なフォーラムに投稿したことを願っています!