【问题标题】:How can I pass a list of objects from Controller to View, where data is retrieved from database using Linq in ASP.Net MVC5如何将对象列表从 Controller 传递到 View,在 ASP.Net MVC5 中使用 Linq 从数据库中检索数据
【发布时间】:2018-04-30 12:46:25
【问题描述】:

我正在尝试将对象列表从控制器传递到 View ,其中使用 LINQ 从数据库中检索对象的属性。型号代码如下:

public class Department
    {

        [Key]
        public int DepartmentId { get; set; }

        [Required(ErrorMessage = "Enter Department Name")]
        [DisplayName("Department Name")]
        public string DepartmentName { get; set; }
    }

控制器代码是:

public ActionResult ShowDepartments()
        {

          var departmentList = db.Deapartment.Select(x => new
            {
                x.DepartmentId,
                x.DepartmentName

            }).ToList();


            return View(departmentList);
        }

查看代码是:

@model List<PractiseMVC11_17_2017.Models.Department>

@{
    ViewBag.Title = "ShowDepartments";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Show Departments</h2>



        <div>

    <table class="table table-bordered table-hover">
        <tbody>

            @foreach (var department in Model)
            {

                <tr>
                    <td>
                        @department.DepartmentId
                    </td>

                    <td>
                        @department.DepartmentName

                    </td>

                </tr>

            }

        </tbody>



    </table>


</div>


}

但是当我运行项目时,它显示以下异常:

异常详细信息:System.InvalidOperationException:传入字典的模型项的类型为“System.Collections.Generic.List1[&lt;&gt;f__AnonymousType32[System.Int32,System.String]]”,但此字典需要模型'System.Collections.Generic.List`1[PractiseMVC11_17_2017.Models.Department]'类型的项目。

【问题讨论】:

    标签: linq asp.net-mvc-5


    【解决方案1】:

    您的视图被强类型化为Department 类对象的集合。但是在您的操作方法中,您正在使用此代码创建一个新的匿名对象列表

    db.Deapartment.Select(x => new
                                 {
                                    x.DepartmentId,
                                    x.DepartmentName
    
                         })
    

    在这里,您正在为db.Deapartment 集合中的每个项目创建一个具有DepartmentIdDepartmentName 属性的匿名对象。您正在将上述代码的结果传递给视图,这是一个匿名对象列表。您的视图现在获得的类型与强类型不同,因此您遇到了异常。

    所以只需在db.Deapartment 上传递ToList() 并将其传递给视图。

    public ActionResult ShowDepartments()
    {
        var departmentList = db.Deapartment.ToList();
        return View(departmentList);
    }
    

    这里的departmentList 变量将是Deapartment 对象的集合。

    【讨论】:

      【解决方案2】:

      Shyju 答案有效,因为您传递给视图的对象恰好与数据库对象相同。情况并非总是如此(事实上,如果不是这样更好)。

      处理这个问题的正确方法是创建一个命名对象:

            var departmentList = db.Deapartment.Select(x => new Department
              {
                  x.DepartmentId,
                  x.DepartmentName
      
              }).ToList();
      

      (我会使用 LINQ 语法,但 lambda 语法也可以)

            var departmentList = 
                        (from x in db.Deapartment
                         select new Department
                        {
                             x.DepartmentId,
                             x.DepartmentName
                        }).ToList();
      

      【讨论】:

        猜你喜欢
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 2020-02-17
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        相关资源
        最近更新 更多