2012-05-23 2 views
10

Я новичок в MVC3, у меня есть несколько моделей, таких как, ContactPerson, ServiceArea, Address и многие другие модели. У меня есть одна страница просмотра, где общие страницы просмотра, такие как Contacts, BusinessDetails, Address, ServiceArea и т. Д. Все они находятся в виде вкладок. У них есть собственные модели.Как отредактировать несколько моделей в одном представлении Razor

Моя проблема заключается в том, как редактировать несколько моделей на одной странице редактирования. Перед отправкой этого сообщения я беру на себя помощь примера MVC3 «Music Store», но есть только одна модель ALBUM, и они дают операцию редактирования для одной модели, если есть одна или несколько моделей, как я буду редактировать на той же странице просмотра.

Я уже создал класс спецификации бизнес-класса. Это из 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 если есть больше моделей, как я выполнить операцию редактирования на нескольких моделях и посмотреть?

ответ

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 

Затем измените Получ быть что-то вроде:

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

Затем измените метод Post принимать тип 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); 
}  

Предположим, что ваш вид имеет что-то вроде (завернутое в форме с кнопки отправки, конечно):

@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

что им письма после того, как если (ModelState. IsValid) { для редактирования конкретной модели. – user1196392

+0

@ user1196392 Не могли бы вы назвать что-то вроде 'Save' в ваших классах данных? Что-то вроде 'model.Album.Save();' для каждого типа в модели. – mattytommo

20

Вам нужно включить другие ViewModels в основной 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 
} 
+0

это решение не работает для меня – user1196392

+1

Это был просто псевдокод, который нельзя воспринимать буквально, вам нужно выяснить, как его правильно исправить или опубликовать новый код, который вы пытаетесь, чтобы мы могли помочь дальше. Сохраняйте цикл обратной связи :-) –

0

Один альтернативный способ заключается в использовании C# кортежей
http://www.dotnetperls.com/tuple
На ваш взгляд и контроллер, определить кортеж, который представляет собой список ваших классов (моделей)

Смежные вопросы