我是新来MVC3,我有一个多车型,如BussinessDetails
, ContactPerson
, ServiceArea
, Address
,还有更多车型。 我在那里共享视图页面像一个单一的视图页面Contacts
, BusinessDetails
, Address
, ServiceArea
等。这些都在标签。 他们,有自己的模型。
我的问题是如何在同一编辑视图页编辑多个模型。 发送这篇文章之前,我把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
,如果有更多的型号如何,我多模型和视图进行编辑操作?
您需要包括其他的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
}
您需要创建包含你所需要的类型的视图模型。 像这样的东西(假设你正在编辑既是专辑和艺术家):
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)
一种替代方法是使用C#元组
http://www.dotnetperls.com/tuple
在您的视图和控制器,定义一个元组是你的类(模型)的列表