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编写。
我无法读取每个值,如awb,状态,日期等。
我在这里错过了什么吗?
答案 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 });
在这种情况下,我返回动态。但是,代码工作正常。