2012-05-23 13 views
10

Jestem nowy w MVC3, mam wiele modeli takich jak BussinessDetails, ContactPerson, ServiceArea, Address i wiele innych modeli. Mam stronę pojedynczego widoku, w której udostępnione strony widokowe, takie jak Contacts, BusinessDetails,, ServiceArea itd. Są w kartach. Mają tam własne modele.Jak edytować wiele modeli w jednym Razor View

Mój problem polega na tym, jak edytować wiele modeli na tej samej stronie widoku edycji. Przed wysłaniem tego posta korzystam z przykładu "Music Store" MVC3, ale jest tylko jeden model ALBUM i dają one operację edycji dla jednego modelu, jeśli istnieje jeden lub więcej modeli, w jaki sposób będę edytować na tej samej stronie widoku.

Mam już utworzoną klasę specyfikacji firmy macierzystej. Jest to z MVC „Music Store”

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

W HTTP POST jest wyłącznie w modelach ALBUM jeśli jest więcej modeli jak mam wykonać operację edycji na wielu modelach i zobaczyć?

Odpowiedz

8

Musisz utworzyć model widoku, który zawiera oba typy, których potrzebujesz.Coś jak to (zakładając edytowania zarówno album i artysty):

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

Następnie zmienić widok do korzystania z nowego modelu tak:

@model MyModel 

Następnie zmień swój sposób dostać się do być coś takiego:

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

Następnie zmienić metody pOST do podjęcia typ MyModel:

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

Zakładając swój pogląd ma coś podobnego (zawinięte w formie z przycisku Prześlij oczywiście):

@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) 
+1

co im pisanie po if (ModelState. IsValid) { , aby edytować konkretny model. – user1196392

+0

@ user1196392 Nie możesz wywołać czegoś takiego jak "Zapisz" na swoich klasach danych? Coś jak 'model.Album.Save();' dla każdego typu w modelu. – mattytommo

20

trzeba podać inne ViewModels do głównej CompositeModel jak tak

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

Wyślij to do swojego widoku w ten sposób, aby:

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

Zmodyfikuj widok, aby uzyskać nowy typ modelu

@model CompositeModel 

Aby odwołać się do właściwości podrzędnych modeli można użyć składni jak ten

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

lub można utworzyć widok w folderze EditorTemplates że trwa sub-modelu jak AlbumModel i używać EditorFor jak to

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

szablon będzie wyglądać następująco

@model AlbumModel 

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

Teraz po prostu prześlij CompositeModel z powrotem do kontrolera, a następnie zapisz wszystkie podmodele, a teraz Bob jest twoim wujem!

[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 
} 
+0

to rozwiązanie nie działa dla mnie – user1196392

+1

To był po prostu pseudokod, którego nie należy traktować dosłownie, będziesz musiał dowiedzieć się, jak go naprawić lub wysłać nowy kod, który próbujesz, abyśmy mogli pomóc dalej. Utrzymuj pętlę opinii :-) –

Powiązane problemy