使用.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下使代码的本质发挥作用吗?
非常感谢
斯蒂芬
p.s。为了完整起见,这里是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; }
}
}
答案 0 :(得分:0)
根据异常消息,在传递单个 Task
项目时,您的视图期望包含EMonitoringAlert
个项目的 array 。< / p>