【问题标题】:how to show viewbag data in html table by converting viewbag object to list in asp.net mvc如何通过将viewbag对象转换为asp.net mvc中的列表来在html表中显示viewbag数据
【发布时间】:2020-12-05 14:52:53
【问题描述】:

我从控制器传递 viewbag 中的列表数据。访问 viewbag 作为列表时出现错误。

error - 'Object reference not set to an instance of an object.'

在这一行出现错误。 ViewBag.Total_PowerList as IEnumerable<TransformerEnergyMonitoring.Models.KWHConsumption>

查看

@model IEnumerable<TransformerEnergyMonitoring.Models.KWHConsumption>
    <div class="row">
     
            <div class="table-responsive">
                <table id="myTable" class="table table-bordered table-hover table-striped">
                    <thead class="table-header">
                        <tr>
                            <th>Date</th>
                            <th>KWH Reading</th>
                            <th>KWH Consumption</th>
                        </tr>
                    </thead>
                    <tbody>
                            @foreach (var item in (ViewBag.Total_PowerList as IEnumerable<TransformerEnergyMonitoring.Models.KWHConsumption>))
                            {
                                <tr>
                                    <td>@item.timeStamp</td>
                                </tr>
                            }
                    </tbody>
                </table>
            </div>
    </div>

数据集

{ timeStamp = 12/5/2020 12:00:00 AM, finalState = 47326.95, consuption = 1455.71 }

控制器

public ActionResult KWHDateWise(RangeSelection RS)
    {
        DateTime ToDate = Convert.ToDateTime(RS.ToDate).AddDays(1);
        RS.ToDate = ToDate;

        List<KWHConsumption> kwhcon = new List<KWHConsumption>();
        
      var Total_PowerList = db.Total_Power.Where(u => u.DeviceImei == RS.DeviceImei && (u.DeviceTimeStamp >= RS.FromDate && u.DeviceTimeStamp <= RS.ToDate)).OrderByDescending(u => u.DeviceTimeStamp).ToList();

        ViewBag.Total_PowerList= Total_PowerList
.GroupBy(
    i => i.DeviceTimeStamp.Date,
    (timeStamp, dayilyData) => new { timeStamp, dayilyData })
.Select(i => new
{
    i.timeStamp,
    finalState = i.dayilyData.Max(x => x.KWH),
    consuption = (i.dayilyData.Max(x => x.KWH) - i.dayilyData.Min(x => x.KWH))
})
.ToList();
        return PartialView("~/Views/TransEnergyHistory/_KWH.cshtml", kwhcon);
    }

型号

 public class KWHConsumption
    {
       
        public DateTime timeStamp { get; set; }
        public double finalState { get; set; }
        public double consuption { get; set; }

    }

【问题讨论】:

  • 你为什么要通过viewbag?您已经有一个viewmodel,只需向其中添加列表并使用它。
  • 该模型用于填充其他数据。我只需要在这里使用viewbag。
  • 还有什么错误呢?我没有看到框架抛出异常。您是否期待特定的输出,但得到了不同的结果?请更新您的问题,以便更清楚地了解该问题。
  • 'object' 在我使用@item.timeStamp 时不包含'timeStamp' 的定义
  • 您可能只需要将您的 viewbag 对象绑定到列表中包含的类型的类。

标签: c# asp.net-mvc linq


【解决方案1】:

当您使用 viewbag 时,它是一个不关心内部数据类型的动态结构,您应该做的是将数据类型转换为您想要的类型,这里有一个示例:

提供了这个TestModel

public class TestModel
{
    public string Id { get; set; }
    public int Number { get; set; }
    public string Name { get; set; }
}

和控制器中的这个动作

    public IActionResult Index()
    {
        var vm = new List<TestModel>() {
            new TestModel(){
                Id = "randomId1",
                Name = "randomName1",
                Number = 2
            },
            new TestModel(){
                Id = "randomId2",
                Name = "randomName2",
                Number = 1
            },
            new TestModel(){
                Id = "randomId3",
                Name = "randomName3",
                Number = 3
            },
        };
        ViewBag.TestModels = vm;
        return View();
    }

在你看来应该是这样的

@foreach (var item in (ViewBag.TestModels as IEnumerable<TestModel>))
{
  <tr>
    <td>@item.Id</td>
    <td>@item.Number</td>
    <td>@item.Name</td>
  </tr>
}

我假设在你的情况下你想要的方式是

(ViewBag.Total_PowerList as IEnumerable<TransformerEnergyMonitoring.Models.Total_Power>)

【讨论】:

  • 我已经按照你所说的进行了尝试,但出现错误 - '对象引用未设置为对象的实例。',你可以检查一下我更新的代码
  • 你应该调试并检查viewbag对象是否真的有列表。因为我测试了代码并且它可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2016-06-07
  • 2012-05-18
相关资源
最近更新 更多