【问题标题】:How to pass selected query list using ViewBag如何使用 ViewBag 传递选定的查询列表
【发布时间】:2020-01-03 18:15:46
【问题描述】:

我已从 sql server 获取数据并将其传递给如下所述的列表

var query = (from employee in db.LKEmployeeDatas   //Getting data from databse from join without using foreign key relationship
             join transaction in db.AssetTransactions on employee.SamAccountName equals transaction.SamAccountName
             select new 
             {
                displayName=employee.SamAccountName                     
             }).ToList();

我添加并传递了上面的列表以使用 ViewBag 进行查看

ViewBag.query = query;

之后我会显示如下所述的列表

@{    
    foreach (var k in ViewBag.query)
    {
       @k.displayName
    }
}

但它给了我以下错误

异常详情: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“对象”确实 不包含“displayName”的定义

我不明白解决方案是什么

【问题讨论】:

  • 在你的例外object does not contain a definition for displayName中说明了一切。
  • 推荐使用ViewModels,因为它更容易使用。

标签: c# sql-server asp.net-mvc entity-framework


【解决方案1】:

ViewBag 是一个动态对象 - 您可以在其中存储任何内容,当从中检索项目时,您必须将它们转换为正确的(例如原始)类型。

 foreach (var k in (originalTypeOfQuery)ViewBag.query)
 {
   @k.displayName
 }

查看您的代码,也许最好将查询的输出转换为List<string>,因为您只检索employeeSamAccountName 属性。如果您需要获取更多属性,请创建一个映射这些属性的类。

【讨论】:

  • 我收到以下编译错误foreach statement cannot operate on variables of type 'originalTypeOfQuery' because 'originalTypeOfQuery' does not contain public instance definition for getenumerator
  • 将光标悬停在原始代码中的 "var" 点 var query = (from... 现在假设您正在使用 VS 强类型函数的结果应该弹出 var。替换 "originalTypeOfQuery"用它。
  • @RasinduDeAlwis 如果对您有帮助,您可以接受并支持我的回答,谢谢
【解决方案2】:

Matěj 之前的回答在您的问题中是正确的。只是补充一点,如果您想将更复杂的对象列表传递给您的View,您可以执行其中一个...我假设您有一个名为Employee 的类/模型,它模仿了一些/全部这些示例的Employee 表中的列:

选项 1:

在控制器中:

List<Employee> query = (from employee in db.LKEmployeeDatas   //Getting data from databse from join without using foreign key relationship
                 join transaction in db.AssetTransactions on employee.SamAccountName equals transaction.SamAccountName
                 select new Employee()
                 {
                     displayName=employee.SamAccountName,
                     otherField=employee.otherField
                 }).ToList();

ViewBag.LKEmployeeDatasList = query;

在视图中:

@{
    var myList = ViewBag.LKEmployeeDatasList==null ? new List<LKEmployeeDatas>() : (List<LKEmployeeDatas>)ViewBag.LKEmployeeDatasList;

    if(myList.Any()) {
       foreach(var item in myList) {
           @item.displayName
           @item.otherField
       }
    }
}

if(myList.Any()) 将保护您免受因没有 ViewBag 存在而导致的任何错误...就像之前的 ViewBag 上的 iif 语句一样。

选项 2:

将视图设为强类型。

在控制器中:

List<Employee> query = (from employee in db.LKEmployeeDatas   //Getting data from databse from join without using foreign key relationship
                     join transaction in db.AssetTransactions on employee.SamAccountName equals transaction.SamAccountName
                     select new Employee()
                     {
                         displayName=employee.SamAccountName,
                         otherField=employee.otherField
                     }).ToList();

 return View(query);  //passing a List<Employee> object over to the view

在视图中:

@model IEnumerable<Employee>
@if(Model.Any()) {
    foreach(var item in myList) {
        @item.displayName
        @item.otherField
    }
}

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多