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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法显示从控制器到视图的LINQ查询输出值相关的知识,希望对你有一定的参考价值。

Controller

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

View

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

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

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

Debug

enter image description here

Web Page

enter image description here

Error

我无法读取每个值,如awb,status,date等。

enter image description here

我在这里错过了吗?

答案

查询结果是一个匿名类,在循环中,每个项都是一个对象,因此异常,对象现在有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

另一答案

首先,您可以为返回的数据创建一个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>
另一答案

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

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也是动态的。

UPDATE

同样的问题被问到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 });

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

以上是关于无法显示从控制器到视图的LINQ查询输出值的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表视图中的数据从一个片段发送到另一个片段

SQL 查询显示了良好的数据库值,但 LINQ to Entity 框架从无处获得空值

Linq 查询获取与 sql 查询视图不同的值

无法从 Linq 查询 EF Core 访问字段值

无法从 onListItemClick 开始片段

如何将参数从 LINQ 查询传递到 SQL 视图?