2010-02-22 3 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]
  • Action (строка) - Audit.Action
  • Отметка (DateTime) - 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 просто сильно типизированных view, связанный с классом AuditEntries с использованием типа просмотра списка MVC по умолчанию.

Кажется, что все нормально, но я уверен, что его можно улучшить - есть ли у кого-нибудь предложения?

1

Возможно, вы захотите рассмотреть вопрос о заполнении идентификатора и имени сотрудника во время создания записи аудита, если, конечно, вы никогда не удаляете данные о своих сотрудниках. Обычно я это делаю, потому что мой источник людей поддерживается извне в нашем каталоге предприятий. Сохранение полных данных в таблице аудита означает, что вам не нужно комбинировать запросы, чтобы получить то, что вы хотите, и ваши данные аудита остаются нетронутыми, даже если лицо, выполняющее действие, оставляет компанию, и их данные удаляются из таблицы сотрудников. Единственное, что вам нужно беспокоиться, это изменение имени, поэтому я сохраняю как идентификатор, так и имя, чтобы при необходимости можно было зафиксировать имя.

+0

Приобретено, потому что это привлекло мое внимание целостности данных аудита.Теоретически персонал никогда не должен удаляться (у приложения есть собственное хранилище данных персонала), но мне нравится комбинированный approrach идентификатора и имени. Я все равно хотел бы выяснить, как создать свою собственную «гибридную модель», хотя, я думаю, мне нужно будет использовать ее для других частей приложения. –

Смежные вопросы