声明@model List在视图中发送LINQ查询结果会导致错误

本文关键字:查询 LINQ 结果 错误 List @model className 视图 声明 | 更新日期: 2023-09-27 18:11:17

. NET MVC核心应用程序,如果我通过下面查询1和2的LINQ查询结果,我得到以下错误。另一方面,如果我传递LINQ Query 3的结果,我将得到正确显示的视图,没有任何错误。但是查询3发送的是Blogs表的所有列,而我只想发送这些列我想在视图中显示的。问题:我怎样才能避免下面的错误,而只发送列到我想在视图中显示的视图?

注意:我想避免使用ViewModel,因为我在LINQ查询中只使用一个表。此外,很明显,查询是从一个Action方法发送的,为了简短起见,这里没有包括这个方法:

误差

:

InvalidOperationException:传入ViewDataDictionary的模型项类型为'System. collections . generic . list '1[<>f__AnonymousType3 ' 3[System. int32,System. string,System. int32],但是这个ViewDataDictionary实例需要一个类型为'System.Collections.Generic.List'1[myproject . models . blog]'的模型项

LINQ Query 1:

var qry = from b in _context.Blogs
                        select new {b.BlogId, b.BlogName, b.IsNotified};
            return View(await qry.ToListAsync());

LINQ Query 2:

var qry = from b in _context.Blogs
         select new { BlogId= b.BlogId, BlogName= b.BlogName, IsNotified = b.IsNotified};
          return View(await qry.ToListAsync());

LINQ Query 3:

var qry = from b in _context.Blogs
          select b;
          return View(await qry.ToListAsync());
<<p> 视图/strong>:
@model List<myProj.Models.Blogs>
<form asp-controller="DbRelated" asp-action="BlogsReview" method="post">
    <table class="table">
        <thead>
            <tr>
                <th></th>
                <th>
                    Blog Name
                </th>
                <th>
                    Is Notified
                </th>
            </tr>
        </thead>
        <tbody>
            @for (int i = 0; i < Model.Count(); i++)
            {
            <tr>
                <td>@Html.HiddenFor(r => r[i].BlogId)</td>
                <td>
                    @Html.EditorFor(r => r[i].BlogName)
                </td>
                <td>
                    @Html.CheckBoxFor(r => r[i].IsNotified)
                </td>
            </tr>
            }
        </tbody>
    </table>
    <button type="submit" class="btn btn-default">Save</button>
</form>

声明@model List<className>在视图中发送LINQ查询结果会导致错误

此错误是因为您返回给视图的类型与视图期望的类型不同。

我建议你创建一个ViewModels文件夹然后在文件夹中创建一个ViewModel类,它基本上是一个只有你将在视图中使用的属性的类然后改变视图上的模型类型

ViewModel可以像这样

public class BlogViewModel 
{
   public int Id {get; set;}
   public string Name {get; set;}
   public bool IsNotified {get; set;}
}

linq查询

var viewModelList = new List<BlogViewModel>();
_context.Blogs.ForEach(b => 
{
  viewModelList.Add(new BlogViewModel
   {
     Id = b.BlogId,
     Name = b.BlogName,
     IsNotified = b.IsNotified
   });
});
return View(viewModelList);

视图
@model IEnumerable<MyProject.ViewModels.BlogViewModel>
<form asp-controller="DbRelated" asp-action="BlogsReview" method="post">
<table class="table">
    <thead>
        <tr>
            <th></th>
            <th>
                Blog Name
            </th>
            <th>
                Is Notified
            </th>
        </tr>
    </thead>
    <tbody>
        @foreach (var blog in Model)
        {
        <tr>
            <td>@Html.HiddenFor(r => r.Id)</td>
            <td>
                @Html.EditorFor(r => r.Name)
            </td>
            <td>
                @Html.CheckBoxFor(r => r.IsNotified)
            </td>
        </tr>
        }
    </tbody>
</table>
<button type="submit" class="btn btn-default">Save</button>

查询1和2得到错误的原因是linq返回匿名对象的IEnumerable:

select new {b.BlogId, b.BlogName, b.IsNotified}; 

这不是模型所期望的Blog对象的相同类型,而是一个新类型(在编译时创建),并且有3个字段。

在您的第三个查询中,您的select返回b,其类型为Blog,这意味着结果将是List<Blog> ->,如模型所期望的。


为了只发送你想要的列:创建一个只有这些字段的新类类型,并执行:

public class BlogDTO 
{
   public int Id {get; set;}
   public string Name {get; set;}
   public bool IsNotified {get; set;}
}
var qry = from b in _context.Blogs
          select new BlogDTO { Id = b.BlogId, Name = b.BlogName, IsNotified = b.IsNotified}; 
return View(await qry.ToListAsync());

,对于视图:

@model List<myProj.Models.BlogDTO>