在我的.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>
请多多指教!
答案 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();