2010-02-22 180 views
0

我为ASP.NET MVC应用程序创建了一个审计表来跟踪关键更改和操作。我想在视图上以易于阅读的格式向授权用户呈现此表的内容。在ASP.NET MVC中创建一个混合模型(与其他模型的位)?

审核表(简体),像这样:

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但我们正在朝着发展的结束和我想通过展示员工姓名而不是StaffID来整理这一观点。

起初,我使用创建一个包含审计和工作人员,并通过“混合模式”的做法,即为了视图:

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) - Audit.ID
  • StaffName(字符串) - Staff.ID [S => s.StaffID == Staff.ID]
  • 动作(字符串) - Audit.Action
  • 时间戳(日期时间) - Audit.Timestamp

但我想在控制器中做到这一点,并将它作为ToList()传递给视图,这样我的视图可以变得更清晰和更简单。

任何提示?

回答

0

好的,所以我冒险尝试自己弄清楚这一点,我有一个解决方案,但我不知道它有多正确!

所以,首先,我创建了一个新的类:

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()); 
} 

现在我ViewAuditTrail视图仅仅是一个强类型使用默认的MVC列表视图类型绑定到AuditEntries类的视图。

它似乎工作正常,但我敢肯定它可以改进 - 有没有人有任何建议?

1

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

+0

Upvoted因为它引起了我的注意审计数据的完整性。理论上,员工永远不应该被删除(应用程序拥有自己的员工数据存储),但我喜欢ID和名称的结合。 我仍然想知道如何创建自己的“混合模型”,因为我认为我需要将它用于应用程序的其他部分。 – 2010-02-22 13:20:38

相关问题