10

私は MVC3 を初めて使用します。 BussinessDetailsContactPersonServiceAreaなどAddressの複数のモデルがあります。ContactsBusinessDetails、などAddressの共有ビュー ページServiceAreaがすべてタブにある単一のビュー ページがあります。独自のモデルがあります。

私の問題は、同じ編集ビュー ページで複数のモデルを編集する方法です。この投稿を送信する前に、MVC3 の「Music Store」の例を参考にしましたが、モデルは 1 つしかなく、モデルALBUMが 1 つ以上ある場合は、同じビュー ページで編集する方法を 1 つのモデルに編集操作を与えます。

私はすでに親業務仕様クラスを作成しています。これはMVC「ミュージックストア」からです

public ActionResult Edit(int id) {
    Album album = db.Albums.Find(id);
    ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
    ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
    return View(album);
}                                                        

[HttpPost]
public ActionResult Edit(Album album) {
    if (ModelState.IsValid) {
        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 POSTか?ALBUM

4

3 に答える 3

21

他のViewModelをメインに含める必要がありCompositeModelます

public class CompositeModel {
    public Album AlbumModel { get; set; }
    public Another AnotherModel { get; set; }
    public Other EvenMore { get; set; }
}

そのようにあなたのビューにそれを送ってください

public ActionResult Index() {
    var compositeModel = new CompositeModel();
    compositeModel.Album = new AlbumModel();
    compositeModel.OtherModel = new AnotherModel();
    compositeModel.EvenMore = new Other();        
    return View(compositeModel)
}

ビューを変更して、新しいモデルタイプを取得します

@model CompositeModel

サブモデルのプロパティを参照するには、次のような構文を使用できます

@Html.TextBoxFor(model => model.Album.ArtistName)

EditorTemplatesまたは、次のようなサブモデルを取り、このようAlbumModelに使用するビューをフォルダに作成できますEditorFor

@Html.EditorFor(model => model.Album)

テンプレートは次のようになります

@model AlbumModel

@Html.TextBoxFor(model => model.AlbumName)
@Html.TextBoxFor(model => model.YearReleased)
@Html.TextBoxFor(model => model.ArtistName)

CompositeModelコントローラーにポストバックして、すべてのサブモデルを保存すると、ボブがおじになります。

[HttpPost]
public ActionResult Index(CompositModel model) {
    // save all models
    // model.Album has all the AlbumModel properties
    // model.Another has the AnotherModel properties
    // model.EvenMore has the properties of Other
}
于 2012-05-23T13:22:00.187 に答える
8

必要な両方のタイプを含むビュー モデルを作成する必要があります。このようなもの (アルバムとアーティストの両方を編集していると仮定):

public class MyModel
{
    public Album Album { get; set; }
    public Artist Artist { get; set; }
    public SelectList Genres { get; set; }
    public SelectList Artists{ get; set; }
}

次に、次のように新しいモデルを使用するようにビューを変更します。

@model MyModel

次に、Get メソッドを次のように変更します。

public ActionResult Edit(int id) 
{
    var model = new MyModel();
    model.Album = db.Albums.Find(id);
    model.Artist = yourArtist; //whatever you want it to be
    model.Genres = new SelectList(db.Genres, "GenreId", "Name", model.Album.GenreId);
    model.Artists = new SelectList(db.Artists, "ArtistId", "Name", model.Album.ArtistId);

    return View(model);
}  

MyModel次に、タイプを取るように Post メソッドを変更します。

[HttpPost]
public ActionResult Edit(MyModel model) {

    if (ModelState.IsValid) {
    //save your items here

        db.SaveChanges();

        return RedirectToAction("Index");
    }

    model.Genres = new SelectList(db.Genres, "GenreId", "Name", model.Album.GenreId);
    model.Artists = new SelectList(db.Artists, "ArtistId", "Name", model.Album.ArtistId);

    return View(album);
}      

ビューに次のようなものがあると仮定します(もちろん、送信ボタンのあるフォームにラップされています):

@Html.EditorFor(m => m.Artist.Name) //do this for all Artist Fields
@Html.EditorFor(m =? m.Album.Name) //do this for all Album Fields

//the following two show you how to wire up your dropdowns:
@Html.DropDownListFor(m => m.Album.ArtistId, Model.Artists)
@Html.DropDownListFor(m => m.Album.GenreId, Model.Genres)
于 2012-05-23T13:20:44.493 に答える
0

別の方法の 1 つは、C# Tuples
http://www.dotnetperls.com/tuple
を使用することです ビューとコントローラーで、クラス (モデル) のリストであるタプルを定義します。

于 2014-09-01T11:18:00.030 に答える