【问题标题】:How to pass an object to the variables of the c# model如何将对象传递给c#模型的变量
【发布时间】:2019-06-13 22:02:34
【问题描述】:

我正在从 InfluxDB 数据库中读取数据。此查询的结果是对象类型,我需要将此数据传递给具有两个变量的模块。

型号:

 public class DashboardViewModel
 {
      public string time { get; set; }
      public string valor { get; set; }
 }

我在其中执行查询的异步任务:

public async Task<List<Serie>> ConsultaBD()
{
    var _client = new InfluxDb("http://host:8086/", "***", "***");
    List<Serie> series = await _client.QueryAsync("dbName", "SELECT T_PV FROM TFA WHERE time >= '2019-05-21' and time < '2019-05-22'");            

    return series;
}

我将数据传递给模型的 IActionResult:

public IActionResult Index()
{
     DashboardViewModel DatosParaMostrar = new DashboardViewModel();

     DatosParaMostrar.time = ConsultaBD().Result[0].Values[0][0].ToString();
     DatosParaMostrar.valor = ConsultaBD().Result[0].Values[0][1].ToString();

     return View(DatosParaMostrar);
}

返回的数据“QueryBD().Result[0].Values”是这样一个对象:

data->
       [0]->
             [0]= {21/05/2019 0:00:03}
             [1]= 586.5
       [1]->
             [0]= {21/05/2019 0:00:03}
             [1]= 575.4
       [2]->
             [0]= {21/05/2019 0:00:03}
             [1]= 595.5
       [3]->
             [0]= {21/05/2019 0:00:03}
             [1]= 584.25
       [4]->
             [0]= {21/05/2019 0:00:03}
             [1]= 583.625
       .......

使用这段代码我只传递第一个数据,我怎么能传递对象拥有的所有数据?

【问题讨论】:

  • 如果您想获取所有数据,那么您可能应该将您的模型设为list,如果是这样,请遍历您的result 并分配给您的模型列表。
  • ConsultaBD() 将返回Serie 的集合。在您的代码中,您调用ConsultaDB 两次并检索相同的结果。这将命中数据库两次。相反,将结果存储在内存中(即var result = await ConsultaDB(),然后按照@NnN 的建议,遍历列表并构建您的模型。

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


【解决方案1】:

你应该await你的ConsultaBD打电话:

public async Task<IActionResult> Index()
{
    DashboardViewModel DatosParaMostrar = new DashboardViewModel();

    var result = (await ConsultaBD()).First();
    DatosParaMostrar.time = result.Values[0][0].ToString();
    DatosParaMostrar.valor = result.Values[0][1].ToString();

    return View(DatosParaMostrar);
}

如果您想显示所有检索到的数据,而不仅仅是第一个,那么您应该填充您的DashboardViewModel 列表并将其传递给您的视图:

public async Task<IActionResult> Index()
{        
    var results = await ConsultaBD();
    IList<DashboardViewModel> model = results.Select(x => new DashboardViewModel {
         time = x.Values[0][0].ToString(),
         valor = x.Values[0][1].ToString()
    }).ToList();        

    return View(model);
}

【讨论】:

  • 注意添加到操作签名中的async关键字:public async Task&lt;IActionResult&gt; Index() { ... }
  • 在第二个代码中是否需要一个循环?因为如果没有必要只取前两个值
【解决方案2】:

型号:

public class DashboardViewModel
{
    public string time { get; set; }
    public string valor { get; set; }
    public List<DashboardViewModel> lstDashboardviewModel {get; set; }
}

IActionResult:

public IActionResult Index()
{

    DashboardViewModel DatosParaMostrar = new DashboardViewModel();

    foreach(var data in ConsultaBD().Result){
        DatosParaMostrar.time = data.Values[0].ToString();
        DatosParaMostrar.valor = data.Values[1].ToString();
        DatosParaMostrar.lstDatosParaMostrar.Add(DatosParaMostrar);
    }        

    return View(DatosParaMostrar);
}

在您的view 中对model 中的列表进行迭代并进行相应的绑定。

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多