是否可以将后代对象的集合作为.NET Core中的视图模型传递?

时间:2018-06-26 16:55:33

标签: c# asp.net-mvc asp.net-core

使用.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; }
    }
}

1 个答案:

答案 0 :(得分:0)

根据异常消息,在传递单个 Task项目时,您的视图期望包含EMonitoringAlert个项目的 array 。< / p>