【问题标题】:How to create ViewModels in ASP.NET CORE MVC application for multiple tables?如何在 ASP.NET CORE MVC 应用程序中为多个表创建 ViewModel?
【发布时间】:2020-09-12 07:43:19
【问题描述】:

我有 3 个表:1)代理 2)代理队列 3)代理节点。 AgentId 是 1) 中的主键,表 2) 和 3) 依赖于 1。 我想创建一个模型来访问一个视图的这些表的属性。 我是 ASP.NET CORE 的新手,如果有人能指出我做同样事情的正确方向,那就太好了。

我的模型类是:

public class Agents
    {
        [Key]
        [DisplayName("Agent Id")]
        public long AgentId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Status { get; set; }
        [DisplayName("Last Checked")]
        public DateTime LastChecked { get; set; }
        public bool Deleted { get; set; }
        public IEnumerable<Agents> agents { get; set; }
        public IEnumerable<AgentMachines> agentMachines { get; set; }
        public IEnumerable<AgentQueues> agentQueues { get; set; }
    }

public class AgentMachines
    {
        [Key]
        [DisplayName("Machine Id")]
        public long MachineId { get; set; }
        [DisplayName("Agent Id")]
        public long AgentId { get; set; }
        public string Address { get; set; }
        public string IP { get; set; }
        [DisplayName("Logged User")]
        public string LoggedUser { get; set; }
        [DisplayName("AD User Account")]
        public string ADUserAccount { get; set; }
        public IEnumerable<Agents> agents { get; set; }
    }

public class AgentQueues
    {
        [Key]
        [DisplayName("Agent Queue Id")]
        public long AgentQueueId { get; set; }
        [DisplayName("Agent Id")]
        public long AgentId { get; set; }
        [DisplayName("Test Id")]
        public long TestId { get; set; }
        [DisplayName("Value Set Id")]
        public long ValueSetId { get; set; }
        [DisplayName("Process Id")]
        public string ProcessId { get; set; }
        public string Status { get; set; }
        [DisplayName("Update User")]
        public string UpdateUser { get; set; }
        [DisplayName("Schedule Time")]
        public DateTime? ScheduleTime { get; set; }
        [DisplayName("Update Date")]
        public DateTime? UpdateDate { get; set; }
        public bool Deleted { get; set; }
        [DisplayName("Test")]
        public string TestName { get; set; }
        [DisplayName("Value Set")]
        public string ValueSetName { get; set; }
        public IEnumerable<Agents> agents { get; set; }
    }

public class TestAgentDetail
    {
        public IEnumerable<AgentMachines> agentMachines { get; set; }
        public IEnumerable<AgentQueues> agentQueues { get; set; }
        public IEnumerable<Agents> agents { get; set; }
    }

我目前的控制器代码是:

public async Task<IActionResult> Details(long? id)
        {
            var viewModel = new TestAgentDetail();
            viewModel.agents = await _context.Agents
                  .Include(i => i.agentMachines)
                  .Include(i => i.agentQueues)
                  .AsNoTracking()
                  .ToListAsync();

            if (id != null)
            {
                Agents agent = viewModel.agents.Where(
                    i => i.AgentId == id.Value).Single();
                viewModel.agentMachines = agent.agentMachines.Select(s => s.LoggedUser);
            }

            return View(viewModel);
        }

【问题讨论】:

    标签: c# asp.net-mvc visual-studio asp.net-core model-view-controller


    【解决方案1】:

    不确定您的三个表之间的详细关系。这是一个具有AgentsAgentQueue 一对多关系的工作演示,具有AgentsAgentsNodes 一对多关系。创建一个AgentViewModel 来展示数据:

    型号:

    public class Agents
    {
        [Key]
        public int AgentId { get; set; }
        public string AgentName { get; set; }
        public AgentQueue AgentQueue { get; set; }
        public List<AgentNodes> AgentNodes { get; set; }
    }
    public class AgentQueue
    {
        public int Id { get; set; }
        public string QueueName { get; set; }
        public int AgentId { get; set; }
        public Agents Agents { get; set; }
    }
    public class AgentNodes
    {
        public int Id { get; set; }
        public string NodeName { get; set; }
        public Agents Agents { get; set; }
    }
    public class AgentViewModel
    {
        public int AgentId { get; set; }
        public string AgentName { get; set; }
        public string QueueName { get; set; }
        public List<string> NodeName { get; set; }
    }
    

    查看:

    @model IEnumerable<AgentViewModel>
    
    <h1>Index</h1>
    
    <p>
        <a asp-action="Create">Create New</a>
    </p>
    <table class="table">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.AgentId)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.AgentName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.NodeName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.QueueName)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
    @foreach (var item in Model) {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.AgentId)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.AgentName)
                </td>
                <td>
                    @foreach (var node in item.NodeName)
                    {
                        @Html.DisplayFor(modelItem => node)
                        <br />
                    }
                </td>
                <td>
                    @Html.DisplayFor(model => item.QueueName)
                </td>
            </tr>
    }
        </tbody>
    </table>
    

    控制器:

    public class AgentsController : Controller
    {
        private readonly MvcProjContext _context;
    
        public AgentsController(MvcProjContext context)
        {
            _context = context;
        }
    
        // GET: Agents
        public async Task<IActionResult> Index()
        {
            var model = await _context.Agents.Include(a => a.AgentQueue).Include(a => a.AgentNodes)
                                             .Select(a => new AgentViewModel()
                                             {
                                                 AgentId=a.AgentId,
                                                 AgentName = a.AgentName,
                                                 NodeName = a.AgentNodes.Select(an=>an.NodeName).ToList(),
                                                 QueueName = a.AgentQueue.QueueName
                                             }).ToListAsync();
            return View(model);
        }
    }
    

    数据库上下文:

    public class MvcProjContext : DbContext
    {
        public MvcProjContext (DbContextOptions<MvcProjContext> options)
            : base(options)
        {
        }
    
        public DbSet<Agents> Agents { get; set; }
        public DbSet<AgentNodes> AgentNodes { get; set; }
        public DbSet<AgentQueue> AgentQueue { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //configure one-to-one relationship
            modelBuilder.Entity<Agents>()
                .HasOne(a => a.AgentQueue)
                .WithOne(b => b.Agents)
                .HasForeignKey<AgentQueue>(b => b.AgentId);
        }
    }
    

    结果:

    【讨论】:

    • OP的说明,我们也可以在控制器中使用AutoMapper来避免从LINQ查询到视图模型的手动对象转换。
    • @Rena 感谢您回答问题,AgentQueues 和 Agentnodes 都与代理表具有一对多的关系。我只是想知道如何在同一个表中显示来自代理节点的多个值?
    • @Rena 使问题更具体到您的答案,我的表 AgentNodes 具有属性 public long AgentId { get; set; } public string Address { get; set; } public string IP { get; set; } 我想在视图中显示这些多个属性。我必须对视图模型这个?我需要为每个属性创建一个 List 吗?
    • 是的,由于一对多的关系,您需要为每个属性创建一个列表。如果我的回答对您有帮助,您能接受吗?谢谢。
    • @Rena,是的!我去做。如果我想在每个节点的单独表中显示节点,我将如何在视图中做到这一点?你能给我看一个相同的代码示例吗?或者也许分享一些我可以从中阅读的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多