无法显示从控制器到视图的LINQ查询输出值

时间:2017-12-22 14:21:14

标签: c# linq asp.net-mvc-5

控制器

public ActionResult Track(string awb)
    {
        ViewBag.Title = "Track Your Shipment";
        ViewBag.ErrorMessage = string.Empty;
        ViewBag.ShipmentNo = awb;
        FLCourierDetail trackOutput = new FLCourierDetail();

        if (awb != null)
        {
            trackOutput = db.FL_CourierDetail.SingleOrDefault(fLCourierDetail => fLCourierDetail.AWBNumber == awb);
            if (trackOutput != null)
            {
                var courierId = db.FL_CourierDetail.Where(s => s.AWBNumber == awb).Select(s => s.Courier);
                var currentStatus = (from c in db.FL_CourierDetail
                                     join s in db.FL_CourierStatus
                                     on c.Courier equals s.CourierId
                                     where c.AWBNumber == awb
                                     select new { awb = c.AWBNumber, staus = s.StatusId, updated = s.StatusId, remark = s.Remark }).ToList();
                ViewBag.CurrentStatus = currentStatus;
            }
            else
            {
                ViewBag.ErrorMessage = "Shipment number not found.";
            }
        }
        else
        {
            ViewBag.ErrorMessage = "Please provide valid Shipment number.";
        }

        return View(trackOutput);
    }

视图

       <div class="col-md-6">
            @{ 
                var status = ViewBag.CurrentStatus;

                foreach (var item in status)
                {
                    <p>@item</p>
                }
            }
        </div>

如果我使用foreach或if循环迭代,我可以在调试中看到数据,但我无法用html编写。

调试

enter image description here

网页

enter image description here

错误

我无法读取每个值,如awb,状态,日期等。

enter image description here

我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:1)

查询结果是一个匿名类,在循环中,每个项都是一个对象,因此异常,对象现在具有awb属性。

解决此问题的一种方法是定义一个类:

public class Status {
    public string awb { get; set; }
    public int staus { get; set; }
    public int updated { get; set; }
    public string remark { get; set; }
}

然后你的选择看起来像:

... select new Status { awb = c.AWBNumber, staus = s.StatusId, updated = s.StatusId, remark = s.Remark }).ToList();

然后,在视图中:

var status = (List<Status>) ViewBag.CurrentStatus;

另一种可能的解决方案是使用strongly typed view model

答案 1 :(得分:1)

首先,您可以为返回的数据创建Model类;

var currentStatus = (from c in db.FL_CourierDetail
    join s in db.FL_CourierStatus
        on c.Courier equals s.CourierId
    where c.AWBNumber == awb
    select new CurrentStatus  { awb = c.AWBNumber, staus = s.StatusId, updated = s.StatusId, remark = s.Remark }).ToList();

public class CurrentStatus
{
    public string awb { get; set; }

    public int staus { get; set; }

    public int updated { get; set; }

    public string remark { get; set; }
}

其次,您无法输出整个对象,您应该指定要显示的属性;

<div class="col-md-6">
            @{ 
                var status = (List<CurrentStatus>) ViewBag.CurrentStatus;

                foreach (var item in status)
                {
                    <p>@item.awb</p>
                    <p>@item.staus</p>
                    <p>@item.updated</p>
                    <p>@item.remark</p>

                }
            }
</div>

答案 2 :(得分:1)

这真的很奇怪,但在控制台应用程序中,以下代码实际上有效

dynamic even = new List<int> { 1, 2, 3, 4 }
              .Where(x => x % 2 == 0)
              .Select((x, index) => new { Position = index, Num = x });

// Output:
// Position: 0, Number: 2
// Position: 1, Number: 4
foreach (dynamic item in even)
{
    Console.WriteLine($"Position: {item.Position}, Number: {item.Num}");
}

然而,在ASP.NET中,它不起作用,我也不太懂,因为ViewBag 也是动态的。

<强>更新

同样的问题被问到here。引自那里:

  

您正在返回匿名类型的实例。如果您没有使用dynamic,那么您在这里唯一的选择就是返回object - 匿名类型在您自己的函数之外是未知的。如果您有object类型的变量,则会收到编译时错误,表明它没有LogoName属性。您使用dynamic完成的所有操作都将延迟完全相同的查找规则直到运行时。在运行时,可以确定的最佳类型是object

正如这个答案所述,以下一定不能工作,但它有效

static void DoWork()
{
    dynamic evens = GetEvens();
    foreach (dynamic item in evens)
        Console.WriteLine($"Position: {item.Position}, Number: {item.Num}");

}

static dynamic GetEvens() =>
    new List<int> { 1, 2, 3, 4 }
    .Where(x => x % 2 == 0)
    .Select((x, index) => new { Position = index, Num = x });

在这种情况下,我返回动态。但是,代码工作正常。