在视图中显示自定义用户 属性 的推荐方法?

Recommended approach to show a custom user property in a view?

我正在尝试构建一个简单的帮助台应用程序。在此应用程序中,当创建并显示工单时,我想显示创建用户的名字。我正在尝试以最好的方式解决如何做到这一点。

我扩展了 ApplicationUser class 并添加了 FirstName 和 LastName 列。我还在我的工单 table 中创建了两个外键,一个用于创建工单的用户,另一个用于分配给该工单的代理。因此,当显示票证时,我需要同时显示创建者和代理人的名字 + 姓氏,而不是他们的 UserId。

这是我的 ApplicationUser class

public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public ICollection<Ticket> Users { get; set; }
        public ICollection<Ticket> Agents { get; set; }
    }

这是我的模型:

public class Ticket
    {
        public int Id { get; set; }

        public string Subject { get; set; }
        public string Body { get; set; }
        public int Status { get; set; }

        public string UserId { get; set; }
        public string AgentId { get; set; }

        public DateTime Created { get; set; }
        public DateTime LastUpdated { get; set; }
        public DateTime? Completed { get; set; }
        public bool Muted { get; set; }

        [ForeignKey("UserId")]
        public virtual ApplicationUser TicketUser { get; set; }

        [ForeignKey("AgentId")]
        public virtual ApplicationUser TicketAgent { get; set; }
    }

这是我的 DbContext:

        public DbSet Tickets { get; set; }

       protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity()
                        .HasOne(m => m.TicketUser)
                        .WithMany(t => t.Users)
                        .HasForeignKey(m => m.UserId)
                        .OnDelete(DeleteBehavior.Restrict);


            modelBuilder.Entity()
                        .HasOne(m => m.TicketAgent)
                        .WithMany(t => t.Agents)
                        .HasForeignKey(m => m.AgentId)
                        .OnDelete(DeleteBehavior.Restrict);
       }

这是显示特定票证的控制器操作:

    [HttpGet]
    public ViewResult Tickets(int id)
    {
        TicketDetailsViewModel ticketDetailsViewModel = new TicketDetailsViewModel()
        {
            Ticket = _ticketRepo.GetTicket(id)
        };


        return View(ticketDetailsViewModel);
    }

这是我的视图模型:

public class TicketDetailsViewModel
{
    public Ticket Ticket { get; set; }
}

现在,如果我这样做,我可以在我的视图中显示全名:

@inject UserManager userManager;

@{
    var ticketUser = (await userManager.FindByIdAsync(Model.Ticket.UserId)).FirstName + " " + (await userManager.FindByIdAsync(Model.Ticket.UserId)).LastName;
}

但我不确定这是否是一个好方法。我想了解实现此目标的最佳方法。

非常感谢。

你可以在你的 ApplicationUser 中定义一个 _fullname ,然后如果 firstname 和 lastname 都存在,你可以直接调用 Fullname ,例如:

public class ApplicationUser : IdentityUser
{
    private string _fullName;  //new property
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [NotMapped]
    public string FullName
    {
        get
        {
            return _fullName = this.FirstName + "." + this.LastName;
        }
        set
        {
            _fullName = value;
        }
    }

    public ICollection<Ticket> Users { get; set; }
    public ICollection<Ticket> Agents { get; set; }
}

在视图中,只需调用 FullName:

@{
var ticketUser = (await userManager.FindByIdAsync(Model.Ticket.UserId)).FullName;
}