10

我是 MVC3 的新手,我有多个模型,例如、 、BussinessDetails以及ContactPerson更多模型。我有一个单一的视图页面,其中共享视图页面,如,,等。这些都在选项卡中。他们有自己的模型。ServiceAreaAddressContactsBusinessDetailsAddressServiceArea

我的问题是如何在同一个编辑视图页面中编辑多个模型。在发送这篇文章之前,我借助了 MVC3“音乐商店”示例,但只有一个模型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我如何对多个模型执行编辑操作并查看?

4

3 回答 3

21

您需要CompositeModel像这样将其他 ViewModel 包含到 main 中

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发回您的控制器,然后保存所有子模型,现在 Bob 就是您的叔叔了!

[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
}
于 2012-05-23T13:22:00.187 回答
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)
于 2012-05-23T13:20:44.493 回答
0

一种替代方法是使用 C# 元组
http://www.dotnetperls.com/tuple
在您的视图和控制器中,定义一个元组,它是您的类(模型)的列表

于 2014-09-01T11:18:00.030 回答