无法显示从控制器到视图的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
Web Page
Error
我无法读取每个值,如awb,status,date等。
我在这里错过了吗?
答案
查询结果是一个匿名类,在循环中,每个项都是一个对象,因此异常,对象现在有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查询输出值的主要内容,如果未能解决你的问题,请参考以下文章