两个模型在一个视图中的ASP MVC 3

我有2个模型:

public class Person { public int PersonID { get; set; } public string PersonName { get; set; } } public class Order { public int OrderID { get; set; } public int TotalSum { get; set; } } 

我想在单视图中编辑BOTH类的对象,所以我需要这样的东西:

 @model _try2models.Models.Person @model _try2models.Models.Order @using(Html.BeginForm()) { @Html.EditorFor(x => x.PersonID) @Html.EditorFor(x => x.PersonName) @Html.EditorFor(x=>x.OrderID) @Html.EditorFor(x => x.TotalSum) } 

这当然不起作用:.cshtml文件中只允许有一个“模型”语句。 可能有一些解决方法?

创build一个包含两个模型的父视图模型。

 public class MainPageModel{ public Model1 Model1{get; set;} public Model2 Model2{get; set;} } 

通过这种方式,您可以在稍后的时间添加更多的模型,只需很less的工作。

要使用元组,您需要执行以下操作,在视图中将模型更改为:

 @model Tuple<Person,Order> 

要使用@html方法,您需要执行以下操作:

 @Html.DisplayNameFor(tuple => tuple.Item1.PersonId) 

要么

 @Html.ActionLink("Edit", "Edit", new { id=Model.Item1.Id }) | 

Item1指示传递给Tupel方法的第一个参数,您可以使用Item2访问第二个模型等等。

在您的控制器中,您需要创build一个Tupletypes的variables,然后将其传递给视图:

  public ActionResult Details(int id = 0) { Person person = db.Persons.Find(id); if (person == null) { return HttpNotFound(); } var tuple = new Tuple<Person, Order>(person,new Order()); return View(tuple); } 

另一个例子: 在一个视图中的多个模型

另一个不需要创build自定义模型的选项是使用Tuple <> 。

 @model Tuple<Person,Order> 

根据安迪的回答,创build一个既包含两个类的新类也不算干净,但它是可行的。

如果你是拥有非常平坦的模型的粉丝,为了支持这个视图,你应该创build一个特定于这个特定视图的模型。

 public class EditViewModel public int PersonID { get; set; } public string PersonName { get; set; } public int OrderID { get; set; } public int TotalSum { get; set; } } 

许多人使用AutoMapper将其域对象映射到平面视图。

视图模型的概念是它只支持视图 – 没有别的。 每个视图都有一个视图,以确保它只包含该视图所需的内容 – 不是您希望用于其他视图的属性的负载。

只要创build一个包含所有需要的信息的单一视图模型,我所做的就是为每个视图创build一个模型,这样我就可以对每个视图进行具体化,或者创build一个父模型并inheritance它。 或者制作一个包含两个视图的模型。

就我个人而言,我只是将它们添加到一个模型中,但这是我的方式:

 public class xViewModel { public int PersonID { get; set; } public string PersonName { get; set; } public int OrderID { get; set; } public int TotalSum { get; set; } } @model project.Models.Home.xViewModel @using(Html.BeginForm()) { @Html.EditorFor(x => x.PersonID) @Html.EditorFor(x => x.PersonName) @Html.EditorFor(x => x.OrderID) @Html.EditorFor(x => x.TotalSum) } 

好吧,每个人都有道理,我把所有的东西都放在这里,帮助像我这样需要开始结束解释的新手。

根据@安德鲁的回答,你可以让你的大class上两class。

 public class teamBoards{ public Boards Boards{get; set;} public Team Team{get; set;} } 

然后在你的控制器中填写2个模型。 有时你只需要填写一个。 然后在回报中,你引用了这个大模型,并且将其中的2个带到View中。

  TeamBoards teamBoards = new TeamBoards(); teamBoards.Boards = (from b in db.Boards where b.TeamId == id select b).ToList(); teamBoards.Team = (from t in db.Teams where t.TeamId == id select t).FirstOrDefault(); return View(teamBoards); 

在视图的顶部

 @model yourNamespace.Models.teamBoards 

然后加载您的input或显示引用大模型的内容:

  @Html.EditorFor(m => Model.Board.yourField) @Html.ValidationMessageFor(m => Model.Board.yourField, "", new { @class = "text-danger-yellow" }) @Html.EditorFor(m => Model.Team.yourField) @Html.ValidationMessageFor(m => Model.Team.yourField, "", new { @class = "text-danger-yellow" }) 

和。 。 。 回到农场,邮政进来时,参考大class:

  public ActionResult ContactNewspaper(teamBoards teamboards) 

并利用模型返回的内容:

 string yourVariable = teamboards.Team.yourField; 

可能在类中有一些DataAnnotation Validation东西,如果(ModelState.IsValid)放在保存/编辑块的顶部,可能会放入。 。 。

您可以使用演示模式http://martinfowler.com/eaaDev/PresentationModel.html

此演示文稿“查看”模型可以包含人员和订单,这是新的
类可以是你的视图引用的模型。

实际上,有一种方法可以在一个视图上使用两个或多个模型,而不将它们包含在包含两个视图的类中。

使用Employee作为示例模型:

 @model Employee 

实际上被对待。

 @{ var Model = ViewBag.model as Employee; } 

因此,View(employee)方法将模型设置为ViewBag,然后ViewEngine正在对其进行投射。

这意味着,

 ViewBag.departments = GetListOfDepartments(); return View(employee); 

可以用来像,

  @model Employee @{ var DepartmentModel = ViewBag.departments as List<Department>; } 

从本质上讲,你可以使用ViewBag中的任何东西作为“模型”,因为这是它的工作方式。 我并不是说这在架构上是理想的,但是这是可能的。

另一个从来没有被提及过的方法是在MSSQL中创build一个视图,并显示所有的数据。 然后使用LINQ to SQL或其他任何东西来映射它。 在您的控制器中将其返回到视图。 完成。

你不能在一个视图上声明两个模型,试着使用Html.Action("Person", "[YourController]")Html.Action("Order", "[YourController]")

祝你好运。

我希望你觉得它有用!

我使用ViewBag的项目和模型的任务,所以这样我使用两个模型在单个视图和控制器我定义viewbag的值或数据

 List<tblproject> Plist = new List<tblproject>(); Plist = ps.getmanagerproject(c, id); ViewBag.projectList = Plist.Select(x => new SelectListItem { Value = x.ProjectId.ToString(), Text = x.Title });