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()
。
就像在 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()
。