Создание гибридной модели (с битами других моделей) в ASP.NET MVC? - PullRequest
0 голосов
/ 22 февраля 2010

Я создал таблицу аудита для приложения 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. ,

Изначально я использую подход создания гибридной модели, которая содержит как Audit, так и Staff, и передаю ее в представление:

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
  • Метка времени (datetime) - Audit.Timestamp

Но я хочу сделать это в контроллере и передать его представлению в виде ToList (), чтобы мое представление могло быть чище и проще.

Любые советы?

Ответы [ 2 ]

1 голос
/ 22 февраля 2010

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

0 голосов
/ 22 февраля 2010

Ладно, так что я оказался в авантюре и попытался сам в этом разобраться, и у меня есть решение, но я не уверен, насколько оно правильное!

Итак, во-первых, я создал новый класс:

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 - это просто строго типизированное представление, привязанное к классу AuditEntries с использованием стандартного типа представления списка MVC.

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

...