首页 文章

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

提问于
浏览
0

这个问题在这里已有答案:

使用.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 回答

  • 0

    根据异常消息,当您传递单个 EMonitoringAlert 项时,您的视图需要一个 Task 项的数组 .

相关问题