【发布时间】:2020-01-17 12:20:41
【问题描述】:
使用实体框架和 Razor 页面,我目前有一个系统可以将我的模型包装在视图模型中并将它们显示到屏幕上,我认为这是我应该在 MVVM 中执行的操作架构。
但是,我在将“Foo”类型的列表转换为“FooView”时遇到了一些问题,但是将“Foo”类型的变量转换为“FooView”是可以的。代码如下:
学生班
public class Student
{
public Student()
{
Id = null;
FirstName = "";
Surname = "";
Age = 0;
DateOfBirth = new DateTime();
Results = new HashSet<Result>();
}
public Student(string firstName, string surname, DateTime dateOfBirth)
{
Id = null;
FirstName = firstName;
Surname = surname;
DateOfBirth = dateOfBirth;
Results = new HashSet<Result>();
}
public int? Id { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
public int Age { get; private set; }
// Implement backing field
private DateTime _dateOfBirth;
public DateTime DateOfBirth
{
get => _dateOfBirth;
set
{
// Set Age when date of birth is provided
_dateOfBirth = value;
Age = (DateTime.Today.Year - this._dateOfBirth.Year);
if (_dateOfBirth.Date > DateTime.Today.AddYears(-this.Age)) this.Age--;
}
}
public HashSet<Result> Results { get; set; }
public static implicit operator StudentView(Student student)
{
return new StudentView(student);
}
}
成功将学生项目投射到剃刀页面上的学生查看项目 WORKS
@foreach (var item in Model.Result)
{
<tr>
<td>
@Html.DisplayFor(modelItem => ((StudentView)item.Student).FullName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Score)
</td>
<td>
@Html.DisplayFor(modelItem => item.Grade)
</td>
<td>
<a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
<a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
尝试投射列表以键入“学生视图”失败
public async Task OnGetAsync()
{
Student = await _context.Student.Cast<StudentView>().ToListAsync();
}
InvalidCastException:无法转换类型的对象 'StudentManagerDemoCore.Models.Student' 输入 'StudentManagerDemoCore.ViewModels.StudentView'。
StudentManagerDemoCore.Pages.Teacher.ManageStudent.IndexModel.OnGetAsync() 在Index.cshtml.cs
Student = await _context.Student.Cast<StudentView>().ToListAsync();
我有一种感觉,我在这里缺少一些东西,但我不确定它是什么。该错误表明我的转换方法存在问题,但这并不能解释为什么它有时会起作用。
有人知道我哪里出错了吗?
【问题讨论】:
-
看看这个项目:automapper.org
-
请不要将异常发布为截图。将它们作为文本发布。
-
@dymanoid 嗨,我很乐意,但不确定发布它们的格式。否则我认为它会占用很大一部分问题。
-
您可以剪掉不相关的堆栈帧以缩短堆栈跟踪。但一般情况下,发布大的异常文本是没有问题的。
-
发现了以下密切相关的内容:codeproject.com/Articles/1043977/…
标签: c# .net-core entity-framework-core