如何在一个单一的Razor视图编辑多个模型如何在一个单一的Razor视图编辑多个模型(How to

2019-05-14 11:02发布

我是新来MVC3,我有一个多车型,如BussinessDetailsContactPersonServiceAreaAddress ,还有更多车型。 我在那里共享视图页面像一个单一的视图页面ContactsBusinessDetailsAddressServiceArea等。这些都在标签。 他们,有自己的模型。

我的问题是如何在同一编辑视图页编辑多个模型。 发送这篇文章之前,我把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 ,如果有更多的型号如何,我多模型和视图进行编辑操作?

Answer 1:

您需要包括其他的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
}


Answer 2:

您需要创建包含你所需要的类型的视图模型。 像这样的东西(假设你正在编辑既是专辑和艺术家):

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

然后更改发布你的方法取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)


Answer 3:

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



文章来源: How to edit multiple models in a single Razor View