2012-01-16 2 views
2

У меня есть форма ASP.Net, и я хочу отправить электронное письмо, когда пользователь меняет свои данные. В электронном письме должны быть включены только данные, которые были изменены, и всего 15 полей данных.Каков наиболее эффективный способ мониторинга изменений данных в форме ASP.Net?

Я не хочу использовать ORM, так как я обновляю веб-сайт, который для нас создан сторонней стороной, и все их вызовы доступа к данным проходят через собственную библиотеку.

Единственные способы сделать это, я могу думать о

  • сделать еще один запрос к базе данных, чтобы получить старые значения и сравнить форму значения один за другим. Если они разные, присоединитесь к электронной почте.

  • магазин исходные данные где-то, когда он сначала загружается (скрытый поле, сессии, и т.д.), и еще раз сравнить данные одного поля в то время, и добавить различия в сообщение электронной почты

  • есть кто-то на так сказать мне там проще и/или простой способ, что я не думал о

+0

это только страницы ASP, что у вас есть - или есть ли у вас доступ к классам данных, которые они используют? Изменили ли они INotifyProperty? – ChrisBD

+0

@ChrisBD Веб-сайт, если он довольно простой и не соответствует какому-либо конкретному шаблону дизайна. Данные втягиваются в «Object» или «DataSet» и вручную применяются ко всем элементам управления, которым нужны данные. Например, 'txtFirstName = myDataSet.Tables (0) .Rows (0) (" FirstName ")'. Это не мой предпочтительный способ делать вещи, но я не хотел переписывать весь сайт, поэтому я собираюсь с тем, что у них уже есть. – Rachel

+0

@Rachel - Вы хотите, чтобы письмо содержало оригинальные и новые значения, или вам просто нужно знать, что поле * * изменилось? –

ответ

2

всех текстовых поля будут иметь TextChanged события, вы можете их пометить себя как измененные. ComboBox будет иметь событие SelectedIndexChanged и так далее.

Редактировать: все измененные события могут проверять их начальные значения (даже при восстановленных изменениях) и либо отмечать себя как все еще измененные, либо возвращенные, как не измененные.

+0

Если изменения не были отменены, следует исключить из списка, и в этом случае вы все еще смотрите на постоянные начальные значения из сообщения для публикации. – sq33G

+0

Итак, вы предлагаете подключить событие TextChanged для каждого TextBox, и в этом случае TextBox установил какой-то флаг для себя, чтобы сказать, что он был изменен? Это все равно не помогает мне, потому что мне нужны исходные значения, а также измененные значения, и похоже, что это вызовет огромный беспорядок. Электронная почта должна запускаться только в том случае, если пользователь нажимает кнопку «Сохранить», а не когда изменяется какое-либо поле. – Rachel

+0

Да, но вы не проверяете каждое значение изменений, но только те, у которых есть их измененное событие. –

0

Вот некоторые предложения, которые могут/не могут быть полезны:

  • Trigger на таблице базы данных и триггер сравнивает старый (используя DELETED таблицу) и обновляется (с помощью вставленной таблицы), а затем посылает электронное письмо. Это может быть или не быть жизнеспособным, и я не являюсь большим сторонником триггеров.
  • Как вы уже сказали, вы можете сделать другой вызов базы данных, что было бы моим рекомендуемым подходом.
0

Из того, что вы сказали, я считаю, что единственный путь вперед - создать дубликат набора данных в форме для хранения старых данных и выполнить сравнение в том месте, где вы хотите создать электронное письмо.

Для копирования структуры и данных вы можете использовать Dataset.Copy.

Однако теперь, когда я думаю об этом всегда есть Datset.GetChanges() метод и Dataset.AcceptChanges() вместе с DataSet.HasChanges()

Пример кода из этого link:

if(dataSet.HasChanges(DataRowState.Modified | 
     DataRowState.Added)&& dataSet.HasErrors) 
    { 
     // Use GetChanges to extract subset. 
     changesDataSet = dataSet.GetChanges(
      DataRowState.Modified|DataRowState.Added); 
     PrintValues(changesDataSet, "Subset values"); 

     // Insert code to reconcile errors. In this case, reject changes. 
     foreach(DataTable changesTable in changesDataSet.Tables) 
     { 
      if (changesTable.HasErrors) 
      { 
       foreach(DataRow changesRow in changesTable.Rows) 
       { 
        //Console.WriteLine(changesRow["Item"]); 
        if((int)changesRow["Item",DataRowVersion.Current ]> 100) 
        { 
         changesRow.RejectChanges(); 
         changesRow.ClearErrors(); 
        } 
       } 
      } 
     } 
     // Add a column to the changesDataSet. 
     changesDataSet.Tables["Items"].Columns.Add(
      new DataColumn("newColumn")); 
     PrintValues(changesDataSet, "Reconciled subset values"); 
     // Merge changes back to first DataSet. 
     dataSet.Merge(changesDataSet, false, 
      System.Data.MissingSchemaAction.Add); 
    } 
    PrintValues(dataSet, "Merged Values"); 
Смежные вопросы