2013年4月5日金曜日

MVC Music Store で Edit ができない

ASP.NET MVC のサンプルアプリケーションとして紹介されている
「MVC Music Store」ですが、現在ASP.NET MVC3に対応したバージョン3が公開されております。

【ASP.NET】MVC Music Store Tutorial
http://www.asp.net/mvc/tutorials/mvc-music-store

【CodePlex】MVC Music Store
http://mvcmusicstore.codeplex.com/

ただし、チュートリアル通りに進めていくと、管理画面のEditのところで、
OptimisticConcurrencyExceptionが発生しエラーとなってしまいます。


原因は Album Model が AlbumId をバインドしないようになっているからです。

Album.cs
namespace MvcMusicStore.Models
{
    [Bind(Exclude = "AlbumId")]  //←ココ
    public class Album
    {
        [ScaffoldColumn(false)]
        public int AlbumId { get; set; }

        [DisplayName("Genre")]
        public int GenreId { get; set; }
...


解決するには、この部分を消してしまうか、
Album.cs
namespace MvcMusicStore.Models
{
    //[Bind(Exclude = "AlbumId")]
    public class Album
    {
        [ScaffoldColumn(false)]
        public int AlbumId { get; set; }

        [DisplayName("Genre")]
        public int GenreId { get; set; }
...

コントローラー側で別途バインドしてやる必要があります。
StoreManagerController.cs
namespace MvcMusicStore.Models
{
    [Authorize(Roles = "Administrator")]
    public class StoreManagerController : Controller
    {
        ...

        //
        // POST: /StoreManager/Edit/5

        [HttpPost]
        public ActionResult Edit(Album album, int id)
        {
            if (ModelState.IsValid)
            {
                album.AlbumId = id;  //←ココ
                db.Entry(album).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
            ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
            return View(album);
        }

        ...


【参考】
http://mvcmusicstore.codeplex.com/workitem/6648

0 件のコメント:

コメントを投稿