两个模型在一个视图中的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 });