2010-02-22 54 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

相關問題