我对MVC很新,而且我一直在阅读有关ViewModels的内容,但我如何将两个模型发送到我的View,其中查询就是这样
public ActionResult Index(int Id)
{
var People = from a in db.Person
select a;
var Data = from a in db.Member
where a.Person.PersonId.Equals(Id)
select new
{
a.Project.ProjectId,
a.Project.Name,
a.Project.Customer,
a.Project.TechProfile.Select(x => new
{
x.TechId,
x.Name,
x.Elements
}),
a.MemberId,
a.Role,
a.Start,
a.End
};
return View(People);
}
之前我使用的是@model IQueryable<GeoCV.Models.Person>
所以我可以在我的视图中使用@foreach
,但我不知道如何将其他查询提供给View,这样我也可以从中获取数据。< / p>
更新
我正在为我的数据查询创建一个自定义类,但我不知道如何设置TechProfile
的属性
现在我有
public IEnumerable<TechProfile> ProjectTechProfile { get; set; }
在我的自定义课程中,但它不起作用,所以我想我必须指定TechId
,Name
和Elements
?
但是如何?
答案 0 :(得分:4)
ViewModel包装了您通过2个查询获得的2个模型,因此您可以将其作为单个对象返回到视图中。在您的情况下,我们需要首先解决另一个问题。您正在数据查询中返回一个匿名对象。
这意味着,您的数据查询需要返回强类型对象而不是匿名对象。
为您的数据查询创建一个类:
public class MyCustomDataObject
{
public int ProjectId { get; set; }
//... map all properties as needed
}
然后编辑您的数据查询以返回此对象:
var Data = from a in db.Member
where a.Person.PersonId.Equals(Id)
select new MyCustomDataObject
{
ProjectId = a.Project.ProjectId,
//assign all properties
};
现在您需要创建实际的ViewModel类:
public class MyViewModel
{
public IEnumerable<Person> Persons { get; set; }
public IEnumerable<MyCustomDataObject> Data { get; set; }
}
在此之后,您只需要在Actionmethod中为其指定值:
public ActionResult Index(int Id)
{
var People = from a in db.Person
select a;
var Data = from a in db.Member
where a.Person.PersonId.Equals(Id)
select new MyCustomDataObject
{
ProjectId = a.Project.ProjectId,
//...
};
//store data of both queries in your ViewModel class here:
var vm = new MyCustomDataObject();
vm.Persons = People;
vm.Data = Data
//return ViewModel to View.
return View(vm);
}
然后在您的观点中声明:@model Namespace.Subfolder.MyCustomDataObject
答案 1 :(得分:0)
您可以在视图中使用@Html.Action("actionName","controllerName")
方法。您可以将原始视图划分为多个局部视图,然后可以使用@Html.Action("actionName","controllerName")
方法使用动态模型绑定渲染该局部视图。
有关示例代码http://devproconnections.com/development/how-use-aspnet-mvc-render-action-helpers
的详细信息答案 2 :(得分:0)
您可以使用以下方法在单个视图中获取多个模型
private IList<People> GetPeople()
{
return from a in db.Person
select a;
}
private IList<Data> GetData()
{
return from a in db.Member
where a.Person.PersonId.Equals(Id)
select new
{
a.Project.ProjectId,
a.Project.Name,
a.Project.Customer,
a.Project.TechProfile.Select(x => new
{
x.TechId,
x.Name,
x.Elements
}),
a.MemberId,
a.Role,
a.Start,
a.End
};
}
public ActionResult Index(int Id)
{
var MultipleModel = new Tuple<IList<People>,IList<Data>>(GetPeople(),GetData()) { };
return View(MultipleModel);
}