代码之家  ›  专栏  ›  技术社区  ›  Rob Burke

在ASP.NETMVC中创建一个混合模型(与其他一些模型一起)?

  •  0
  • Rob Burke  · 技术社区  · 15 年前

    我已经为ASP.NETMVC应用程序创建了一个审计表来跟踪关键更改和操作。我想在视图上以一种易于阅读的格式将此表的内容呈现给授权用户。

    审核表(简化)如下:

    ID (int) | StaffID (int) | Action (string) | Timestamp (datetime)
    -----------------------------------------------------------------
    1987     | 27            | Delete entry: 9 | 2010-02-22 12:30:12
    1988     | 34            | Add user: 912   | 2010-02-22 12:48:19
    

    到目前为止,我刚刚介绍了在MVC中使用默认的“List”视图,但是我们正在接近开发的末尾,我想通过显示员工姓名而不是职员来整理一下这个视图。

    最初,我使用的方法是创建一个“混合模型”,其中包含审计和人员,并将其传递给视图:

    public class AuditModel
    {
      public AuditModel(List<Audit> AuditEntries, List<Staff> AllStaff)
      {
        this.Audit = AuditEntries;
        this.Staff = AllStaff;
      }
    
      public List<Audit> Audit { get; private set; }
      public List<Staff> Staff { get; private set; }
    }  
    
    [AcceptVerbs("GET")]
    public ActionResult ViewAuditTrail()
    {
      var Audit = (from a in db.Audits orderby a.Timestamp descending select a).ToList();
      var Staff = (from s in db.Staffs select s).ToList();
      return View(new AuditModel(Audit, Staff));
    }
    

    但这导致了观点的混乱:

    <%
    foreach (var Entry in Model.AuditEntries)
    {
      var StaffDetails = Model.AllStaff.Where(s => s.ID == Entry.StaffID).SingleOrDefault();
      /* output HTML */
    }
    %>
    

    所以我想我要做的是创建一个具有以下属性的新模型:

    • ID(int)-审计.ID
    • StaffName(字符串)-Staff.ID[s=>s、 StaffID==Staff.ID]
    • Action(字符串)-Audit.Action

    但是我想在控制器中这样做,并将其作为ToList()传递给视图,这样我的视图就可以更干净、更简单。

    有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   tvanfosson    15 年前

    在创建审计记录时,您可能需要考虑填写工作人员的ID和姓名,当然,除非您对员工数据不做任何删除。我通常这样做是因为我的人员来源是在我们的企业目录外部维护的。在audit表中保留完整的数据意味着您不必合并查询来获得所需的内容,并且即使执行操作的人员离开公司,并且他们的数据从staff表中删除,您的审计数据也完好无损。你唯一需要担心的是名字的改变,这就是为什么我保留了id和名字,这样名字就可以在必要的时候被修正。

        2
  •  0
  •   Rob Burke    15 年前

    好吧,我很有冒险精神,试着自己解决这个问题,我有一个解决办法,但我不确定它有多正确!

    因此,首先,我创建了一个新类:

    public class AuditEntries
    {
      public int ID { get; set; }
      public string StaffName { get; set; }
      public string Action { get; set; }
      public System.DateTime Timestamp { get; set; }
    }
    

    然后,我将ViewAuditTrail操作重构为:

    [AcceptVerbs("GET")]
    public ActionResult ViewAuditTrail()
    {
      var Audit = (from a in db.Audits orderby a.Timestamp descending select a).ToList();
    
      var AuditEntry = new List<AuditEntries>();
    
      foreach (var e in Audit)
      {
        var Staff = (from s in db.Staffs where s.ID == e.StaffID select s).SingleOrDefault();
    
        AuditEntries Entry = new AuditEntries();
        Entry.ID = e.ID;
        Entry.StaffName = Staff.Forename + " " + Staff.Surname + " (" + Staff.ID.ToString() + ")";
        Entry.Action = e.Action;
        Entry.Timestamp = e.Timestamp;
    
        AuditEntry.Add(Entry);
      }
    
      return View(AuditEntry.ToList());
    }