如何将自定义查询结果传递给asp.net中的视图

时间:2016-08-20 16:28:33

标签: c# asp.net .net asp.net-mvc asp.net-mvc-4

我想从我的控制器传递数据到视图。 这是控制器的代码

public ActionResult AllCars()
    {
        try
        {
            int id = System.Web.HttpContext.Current.User.Identity.GetUserId<int>();


            var reservedCars = (from c in db.Cars

                            join o in db.Orders on c.Car_Id equals o.Car_Id
                            join u in db.AspNetUsers on o.Id equals u.Id
                            where u.Id == 5
                            select new
                            {
                                c.Car_Description,
                                c.Car_Id,
                                c.CarMakeId,
                                c.CarModelId,
                                c.Reservation_Status,
                                c.Color
                            });

        return View(reservedCars);
    }
    catch (Exception)
    {

        throw;
    }
}

这是我的视图文件。

@model IEnumerable<FinalProject.Models.ReservedCar>



<table>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Car_Id);
            </td>
        </tr>
     }
    </table>

但是当我运行我的视图时出现以下错误 传递到字典中的模型项的类型为'System.Data.Entity.Infrastructure.DbQuery,但此字典需要类型为'System.Collections.IEnumerable`的模型项

我知道我将dbquery结果传递给视图,我的视图期望它将是iEnumerable。 请指导我如何完成这项任务。我只是想将查询结果传递给我的视图并想要使用它。

ModelClass。 ReservedCar.cs

namespace FinalProject.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class ReservedCar
    {

        public int Id { get; set; }

        public string Car_Description { get; set; }

        public int Car_Id { get; set; }

        public string CarMakeId { get; set; }

        public string CarModelId { get; set; }
        public string Reservation_Status { get; set; }

        public string Color { get; set; }
    }
}

2 个答案:

答案 0 :(得分:3)

目前reservedCars仍然是IQueryable类型的查询表达式。它还没有被评估/执行。因此,reservedCars的类型与您的视图强类型的类型(IEnumerable<ReservedCar>)不同。这就是您遇到类型不匹配错误的原因。

确保您返回ReservedCar课程的集合。您可以更新LINQ表达式的投影部分,以将结果投影到ReservedCar而不是匿名对象。同时在查询上调用ToList()方法,该方法将执行查询表达式并返回该结果。

 var reservedCars = (from c in db.Cars

                            join o in db.Orders on c.Car_Id equals o.Car_Id
                            join u in db.AspNetUsers on o.Id equals u.Id
                            where u.Id == 5
                            select new ReservedCarVm
                            {
                                CarId = c.Car_Id,
                                Description = c.Car_Description,
                                Color = c.Color
                                // Map other properties as needed.
                            }).ToList();
return View(reserverCars);

假设您的ReservedCarVm课程具有ColorCar_DescriptionCar_Id属性,这些属性与Car实体类中的属性相同,如下所示

public class ReservedCarVm
{
  public string Color { set;get;}
  public string Description { set;get;}
 //Add other properties needed by the view here
}

现在确保您的视图强烈输入此视图模型类的集合

@model IEnumerable<ReserverdCarVm>
@foreach(var item in Model)
{
  <p>@item.CarId</p>
  <p>@item.Color</p>
}

答案 1 :(得分:0)

你可以这样做:

而不是@model IEnumerable&lt; FinalProject.Models.ReservedCar&GT;
你可以做@model IQueryable&lt; FinalProject.Models.ReservedCar&GT;

以上不推荐,你不应该直接从视图中调用数据库,我没有看到任何理由这样做。

另外你需要处理dbcontext,在你提供的代码中,你没有处理不好的dbconext

只需通过此

重做您的代码
var reservedCars = (from c in db.Cars

                            join o in db.Orders on c.Car_Id equals o.Car_Id
                            join u in db.AspNetUsers on o.Id equals u.Id
                            where u.Id == 5
                            select new
                            {
                                c.Car_Description,
                                c.Car_Id,
                                c.CarMakeId,
                                c.CarModelId,
                                c.Reservation_Status,
                                c.Color
                            }).ToList();
  db.Dispose();