在onPost方法中使用IQueryable

时间:2019-09-24 17:32:47

标签: asp.net-core .net-core

在我的.net核心项目中,我试图编辑一个数据列表,这些数据是我使用LINQ从数据库中查询的。

我可以在表中显示此数据,没问题,但是一旦单击“提交”数据,就会出现以下异常:

“模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数构造函数。”

并且我的IQueryable设置为null

所以,我有一堂课,

class MyRecord
{
  [Key]
  public int recordID {get; set;}

  public int recordType {get; set;}

  public String recordName {get; set;}
}

然后创建IQueryable列表:

[BindProperty]
public IQueryable<MyRecord> myRecordListQuery

并从数据库中选择一个记录列表

myRecordListQuery = (from r in _context.RecordTable
                     where r.recordType == 0
                     select r);

所以,到目前为止,我的记录很好,并且可以在Razor页面(不是MVC!)中使用它们,类似于创建HTML表并以以下形式使用结果:

<td>
<input asp-for="@Model.myRecordListQuery.Skip(i).First().recordName" class="form-control" />
</td>

因此,记录可以正确显示并可以编辑。

问题是,当我提交表单时,出现上面写的异常...

p.s。如果我使用List而不是IQueryable,它将在post方法上返回正确的数据,但是更新数据库并不是那么容易-从我的角度来看,我需要比较值(是/是)还是更新所有记录,效率低下。 / p>

请多多指教!

2 个答案:

答案 0 :(得分:2)

该异常告诉您问题及其解决方法:您无法绑定到IQueryable,需要使用List<T>之类的东西:

[BindProperty]
public List<MyRecord> myRecordListQuery

您真的不应该将IQueryable传递给视图 。在您的后台代码中实现结果集。

答案 1 :(得分:0)

如果您需要使用IQueryable来“轻松更新数据库”,则可以使“ myRecordListQuery”成为在视图中使用的列表,然后在post方法中将数据投射回IQueryable,因此,在您的get方法中,您可以执行以下操作。

[BindProperty]
public List<MyRecord> myRecordListQuery;

然后在您的帖子中,您可以将返回值转换为IQueryable

IQueryable<MyRecord> iQueryableMyRecord = myRecordListQuery.AsQueryable();