Вопрос по asp.net-mvc, .net, c#, razor, asp.net-mvc-3 – Как редактировать несколько моделей в одном Razor View

10

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

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

Я уже создал родительский класс бизнес-спецификации. Это из MVC & quot; Музыкальный магазин & quot;

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

Ваш Ответ

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
}
это решение не работает для меня user1196392
Это был просто псевдокод, его не следует понимать буквально, вам нужно выяснить, как его исправить или опубликовать новый код, который вы пытаетесь использовать, чтобы мы могли помочь вам в дальнейшем. Продолжайте цикл обратной связи :-)
0

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

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

Затем измените свой метод 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)
@ user1196392 Разве ты не можешь назвать что-то вродеSave на ваших данных классов? Что-то вродеmodel.Album.Save(); для каждого типа в модели.
что я пишу после if (ModelState.IsValid) {для редактирования конкретной модели. user1196392

Похожие вопросы