这个问题在这里已有答案:
使用.NET Core ASP.NET MVC但获得 InvalidOperationException
.
我有一个 Task
类型的基类,以及一个名为'EMonitoringAlert'的类的后代 .
该视图期待一个Task数组的模型 .
@model SquareHat.Notitiam.Task.Task[]
我的控制器:
public async Task<ActionResult> Index(string owner, bool completed = false)
{
Contract.Ensures(Contract.Result<ActionResult>() != null);
ViewBag.Title = "Tasks - Emonitoring Alerts";
SquareHat.Notitiam.Task.Task[] tasks = (await _taskRepository.Get("MonitoringAlert", TaskOwner.All, completed, new Paging(50))).ToArray();
// for now we are assuming they are all emonitoring alerts
for (var index = 0; index < tasks.Length; index++)
{
var task = tasks[index];
if (task.TaskType == "MonitoringAlert")
{
StaffDetail staff = null;
ClientDetail client = null;
var visits = new Visit[] {};
var sid = task.Meta.GetAs("StaffId", -1);
var cid = task.Meta.GetAs("ClientId", -1);
var sd = task.Meta.GetAs("ScheduledStartTime", DateTime.Now.Date);
if (cid != -1) client = await _winRostaContext.ClientById(cid);
if (sid != -1)
{
staff = await _winRostaContext.StaffById(sid);
visits = (await _winRostaContext.VisitsBy(sid, sd.Date, sd.EndOfDay())).ToArray();
}
tasks[index] = new EMonitoringAlert(task, client, staff, visits);
}
}
return View(tasks);
}
忽略了很多细节,实质上,我循环遍历每个通用任务,并确定它是否是我有视图模型的子类型(上面的代码是简化的),此时我创建了一个后代类并填写'额外'细节 . 然后我用后代替换基本'任务' .
你可以很清楚地看到我传递给视图的变量是 Tasks
的数组
Task.Task[] tasks = ....
...
return View(tasks);
但是,当我们运行代码时,我们会收到以下错误
InvalidOperationException:传递给ViewDataDictionary的模型项的类型为'SquareHat.Notitiam.Web.Models.Views.EMonitoringAlert',但此ViewDataDictionary实例需要类型为'SquareHat.Notitiam.Task.Task []'的模型项 .
我本以为框架会理解OOP和类的继承,而不是在接受后代的时候呢?
任何人都可以建议我如何使代码的本质在.NET Core下工作?
非常感谢
斯蒂芬
附:为了完整性,这里是 EMonitoringAlert
的类声明
namespace SquareHat.Notitiam.Web.Models.Views
{
public class EMonitoringAlert : SquareHat.Notitiam.Task.Task
{
public const string DefaultTaskType = "MonitoringAlert";
public EMonitoringAlert()
{ }
public EMonitoringAlert(Task.Task task, ClientDetail client, StaffDetail staff, Visit[] careWorkerVisits)
: base(task)
{
Contract.Requires(task != null);
Client = client;
CareWorker = staff;
CareWorkerVisits = careWorkerVisits;
}
#region Overrides of Task
public override string TaskType
{
get { return base.TaskType ?? DefaultTaskType; }
set { base.TaskType = value; }
}
#endregion
public StaffDetail CareWorker { get; set; }
public ClientDetail Client { get; set; }
public Visit[] CareWorkerVisits { get; set; }
}
}
1 回答
根据异常消息,当您传递单个
EMonitoringAlert
项时,您的视图需要一个Task
项的数组 .