【问题标题】:Returning more than just one model to the View?将不止一个模型返回到视图?
【发布时间】:2015-04-27 09:18:03
【问题描述】:

我对 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,但我不知道如何将我的其他查询获取到视图,以便我也可以从中获取数据。


更新

我正在为我的数据查询创建一个自定义类,但我不知道如何设置TechProfile 的属性

我现在有

public IEnumerable<TechProfile> ProjectTechProfile { get; set; }

在我的自定义类中,但它不起作用,所以我想我必须指定TechIdNameElements
但是怎么做呢?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 我在为我的数据查询创建一个类时遇到了问题,我有TechProfile 的地方我不知道如何在我的类中分配。我把它写成public IEnumerable&lt;TechProfile&gt; ProTechProfile { get; set; },但它不起作用。
  • 什么不起作用?不要忘记您也需要选择它的强类型! .Select(x =&gt; new Techprofile { TechId = x.TechId, ...})
【解决方案2】:

您可以在视图中使用@Html.Action("actionName","controllerName") 方法。您可以将原始视图划分为多个局部视图,然后您可以使用 @Html.Action("actionName","controllerName") 方法通过动态模型绑定渲染该局部视图。

更多详情请参考示例代码http://devproconnections.com/development/how-use-aspnet-mvc-render-action-helpers

【讨论】:

    【解决方案3】:

    您可以使用以下方法在单个视图中获取多个模型

    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

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2017-04-30
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多