0

MvcMusicStore の例で Entity Framework の代わりに Fluent NHibernate を使用しようとしていますが、Create ビューを使用して新しいアルバムを作成する際に ArtistId と GenreId を入力する際に​​問題が発生しています。他のオブジェクトを参照しているという事実と関係があると思います

私のアルバムマップは:

    public class AlbumMap:ClassMap<Album>
    {
        public AlbumMap()
        {
            Id(x => x.AlbumId);
            Map(x => x.AlbumArtUrl);
            References(x => x.Artist).Cascade.All().Column("ArtistId");
            References(x => x.Genre).Cascade.All().Column("GenreId");
            Map(x => x.Price);
            Map(x => x.Title);
        }
    }

コントローラーの Create メソッドは次のようになります。

    public ActionResult Create()
    {
        MusicRepository repository = new MusicRepository();
        ViewBag.ArtistId = new SelectList(repository.GetArtists(), "ArtistId", "Name");
        ViewBag.GenreId = new SelectList(repository.GetGenres(), "GenreId", "Name");
        return View();
    } 

私が問題を抱えている作成ビューの部分は次のとおりです。

    <div class="editor-label">
        @Html.LabelFor(model => model.Genre, "Genre")
    </div>
    <div class="editor-field">
        @Html.DropDownList("GenreId", String.Empty)
        @Html.ValidationMessageFor(model => model.Genre)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Artist, "Artist")
    </div>
    <div class="editor-field">
        @Html.DropDownList("ArtistId", String.Empty)
        @Html.ValidationMessageFor(model => model.Artist)
    </div>

データベースでは、新しいアルバムを作成した後、Title や AlbumUrl などの他のフィールドが入力されますが、ArtistId と GenreId は null に設定されます。

4

1 に答える 1

0

おそらく、私はこれにまったく慣れていないと言うことができますが、実際に問題を解決しました。これを行うには、最初にドロップダウンリスト ヘルパーを dropdownlistfor に変更して、セーブ バックできるようにしました。

    <div class="editor-label">
        @Html.LabelFor(model => model.Genre, "Genre")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.Genre.GenreId, (SelectList)ViewBag.GenreId,"Please select")
        @Html.ValidationMessageFor(model => model.Genre.GenreId)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Artist, "Artist")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.Artist.ArtistId, (SelectList)ViewBag.ArtistId,"Please select")
        @Html.ValidationMessageFor(model => model.Artist.ArtistId)
    </div>

これにより、アーティストとジャンルのプロパティが初期化されたアルバムが返されました。唯一のことは、それらには Id プロパティしか含まれていなかったため、保存する前にこれらを使用して (nhibernate を使用して) 残りのプロパティを取得する必要があったことです。

    [HttpPost]
    public ActionResult Create(Album album)
    {
        try
        {
            MusicRepository repository = new MusicRepository();
            if (ModelState.IsValid)
            {
                album.Artist = repository.GetArtistById(album.Artist.ArtistId);
                album.Genre = repository.GetGenreById(album.Genre.GenreId);
                repository.AddAlbum(album);
                return RedirectToAction("Index");  
            }
            ViewBag.ArtistId = new SelectList(repository.GetArtists(), "ArtistId", "Name");
            ViewBag.GenreId = new SelectList(repository.GetGenres(), "GenreId", "Name");
            return View(album);
        }
于 2012-04-13T14:41:45.920 に答える