Как редактировать несколько моделей в одном представлении Razor

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

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

Я уже создал class спецификации бизнес-classа. Это из 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); } 

В HTTP POST есть только на модели ALBUM если есть больше моделей, как я выполняю операцию редактирования на нескольких моделях и просмотра?

Вы должны включить другие 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 которая использует EditorFor например 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 обратно на ваш controller, а затем сохраните все подмодели, а теперь ваш дядя Боб!

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

Вам нужно будет создать модель просмотра, содержащую оба типа, которые вам нужны. Что-то вроде этого (при условии, что вы редактируете как альбом, так и исполнителя):

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

Затем измените метод 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) 

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

  • Выполнение проверки на стороне клиента для пользовательского атрибута
  • Предоставление частичных представлений с использованием ajax
  • Сложный объект и привязка модели ASP.NET MVC
  • MVC5 Razor html.dropdownlist для набора, выбранного, когда значение находится в массиве
  • Использование Razor без MVC
  • Как создать текстовое поле readonly в ASP.NET MVC3 Razor
  • Razor / CSHTML - Любая польза от того, что у нас есть?
  • Использование расширений MVC HtmlHelper из декларативных представлений Razor
  • Могу ли я служить .html-файлами с помощью Razor, как если бы они были .cshtml-файлами без изменения расширения всех моих страниц?
  • В MVC3 Razor, как мне получить html визуализированного представления внутри действия?
  • Каскадные выпадающие списки в MVC 3 Razor view
  • Давайте будем гением компьютера.