ASP net core 上的装饰器 @属性 就像在 django 中一样

Decorator @property on ASP net core like in django

就像在 Django 中一样,您可以使用 @属性 装饰器添加模型属性而无需更改模型 class。

我正在尝试使用 aspnetcore 实现同样的效果

我的意思是我想向模型 class 添加一些函数,这将 return 一些 string/int 以便从剃刀视图访问它们(例如:model.extraProperty)

@已编辑 添加更多信息....

    public class Ticket
    {
        public int Id { get; set; }
        public int? AssignedId { get; set; }
        public virtual AppUser Assigned { get; set; }
        public int StationId { get; set; }
        public virtual Station Station { get; set; }
        public int FailureId { get; set; }
        public virtual Failure Failure { get; set; }
    }

    public class TicketData
    {
        public int Id { get; set; }
        public int TicketId { get; set; }
        public virtual Ticket Ticket { get; set; }
        public int TicketStatusId { get; set; }
        public virtual TicketStatus TicketStatus { get; set; }
        public string comments { get; set; }

    }

逻辑是: 每次创建工单时,在创建具有打开状态和工单 ID 参考的 TicketData 之后

然后创建另一个TicketData 将状态更改为InProcess,然后创建另一个TicketData 将状态更改为Closed

所以我想从工单视图访问最后一个工单状态

//On Django I would be able to achieved it only adding something like this Ticket.GetStatus()
@property
GetStatus()
{
    _context.TicketData.Where(x => x.TicketId == this.Id).LastOrDefault();
}

希望能得到大家的帮助。

谢谢。

我不确定@属性 方法。您可能会考虑编写自己的 C# 属性来尝试实现类似的目标,但让我提出一个可能的解决方案。

因此,我需要做一些假设,因为该示例并未详细说明您如何以及在何处处理所描述的逻辑。假设你正在做一个例子中的逻辑。 TicketsController.ProcessTicketAction() returns 你的 .cshtml 视图,你实际上需要传递视图的模型一个复杂的对象,它代表整个状态转换。这可以实现,例如。通过在其中传递一组 TicketData。

我在这里要做的是创建一个视图模型 class 例如。 class TicketModel 并在内部定义一个 ICollection<TicketData>,现在无论何时何地您将执行所描述的逻辑,您实际上会新建一个 TicketData,保存 Ticket ref 和 id。

在您的 .cshtml 视图代码中,您可以提取所需的数据,然后使用例如。 LINQ 和 .OrderByDescending(x => (int) x.TicketStatus).FirstOrDefault().

另一种方法可能是改造所提供的解决方案并将 TicketData 集合保存在 Ticket 对象中,并将 GetStatus() 方法放入其中:

    public class Ticket
    {
        public int Id { get; set; }
        public int? AssignedId { get; set; }
        public virtual AppUser Assigned { get; set; }
        public int StationId { get; set; }
        public virtual Station Station { get; set; }
        public int FailureId { get; set; }
        public virtual Failure Failure { get; set; }

        public ICollection<TicketData> Data { get; set; }
    
        public TicketStatus GetStatus() => Data?.OrderByDescending(x => (int) x.TicketStatus)?.FirstOrDefault()?.TicketStatus;
    }

然后假设 Ticket 是您的模型 class 您只需在视图 .cshtml 中使用 Model.GetStatus()