只返回一个模型到视图?

时间:2015-04-27 09:18:03

标签: asp.net-mvc asp.net-mvc-3 model-view-controller

我对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; }

在我的自定义课程中,但它不起作用,所以我想我必须指定TechIdNameElements
但是如何?

3 个答案:

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

这是a codeproject tutorial on the subject