2012-05-23 3 views
10

Je suis nouveau à MVC3, j'ai un plusieurs modèles comme BussinessDetails, ContactPerson, ServiceArea, Address et beaucoup plus de modèles. J'ai une seule page de vue où les pages vues partagées aiment Contacts, BusinessDetails, Address, ServiceArea etc.ces sont tous dans des onglets. Ils ont leurs propres modèles.Comment modifier plusieurs modèles dans une seule vue Razor

Mon problème est de savoir comment éditer plusieurs modèles dans une même page d'édition. Avant d'envoyer ce post je prends l'aide de l'exemple MVC3 "Music Store" mais il y a seulement un modèle ALBUM et ils donnent l'opération d'édition pour un modèle s'il y a un ou plusieurs modèle comment je modifierai dans la même page de vue.

J'ai déjà créé une classe de spécification d'entreprise parente. Ceci est de 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); 
}                 

En HTTP POST il n'y a que sur le modèle ALBUM s'il y a plus de modèles comment je suis effectuer une opération d'édition sur plusieurs modèles et vue?

Répondre

8

Vous devez créer un modèle de vue contenant les deux types dont vous avez besoin.Quelque chose comme ceci (en supposant que vous modifiez à la fois un album et un artiste):

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

changer ensuite votre point de vue d'utiliser le nouveau modèle comme ceci:

@model MyModel 

changer ensuite votre méthode Get être quelque chose comme:

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

changer votre méthode post ensuite de prendre le type 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); 
}  

En supposant que votre vue a quelque chose comme (enveloppé dans une forme avec un bouton d'envoi bien sûr):

@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

ce que l'écriture im après si (ModelState. IsValid) { pour éditer un modèle particulier. – user1196392

+0

@ user1196392 Ne pouvez-vous pas appeler quelque chose comme 'Save' sur vos classes de données? Quelque chose comme 'model.Album.Save();' pour chaque type dans le modèle. – mattytommo

20

Vous devez inclure les autres ViewModels dans un CompositeModel principal comme si

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

Envoyez à votre vue comme si

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

Modifiez votre opinion pour voir le nouveau modèle

@model CompositeModel 

Pour référence aux propriétés des sous-modèles que vous pouvez utiliser cette syntaxe

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

ou vous pouvez créer une vue dans le dossier EditorTemplates qui prend un sous-modèle comme AlbumModel et utiliser EditorFor comme celui-ci

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

Le modèle ressemblerait à quelque chose comme ça

@model AlbumModel 

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

Maintenant, il suffit de poster CompositeModel à votre contrôleur, puis enregistrez tous les sous-modèles et maintenant Bob est votre oncle!

[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

cette solution ne fonctionne pas pour moi – user1196392

+1

C'était juste pseudocode, ne pas être pris au pied de la lettre, vous devrez trouver comment le corriger ou publier le nouveau code que vous essayez afin que nous puissions vous aider davantage. Gardez la boucle de rétroaction en cours :-) –

Questions connexes