3

ASP.NET Dynamic Data Webアプリケーションで作業していますが、レコードの挿入/更新中にデフォルト値を渡す際に問題が発生します。私のアプリケーションでは、すべてのテーブルに次の共通の列があります。

  • CreatedBy(デフォルト値:ログインユーザー)
  • CreatedDate(デフォルト値:DateTime.Now)
  • modifyBy(デフォルト値:ログインしているユーザー)
  • ModifiedDate(デフォルト値:DateTime.Now)

これらの列を非表示にしInsertEditページを表示し、デフォルト値がそれぞれの列に自動的に挿入されるようにします。

私に提案してください。

ありがとうポール

4

4 に答える 4

2

簡単な監査を行っているようですが、こちらのブログ投稿をご覧ください。EntityFramework4.xを使用した動的データの基本的な監査が役立つことを願っています。

ページでこの種のことを行うのは決して良いことではありません。データモデル/レイヤーで行うのが常に最善です。動的データで列生成を行うための新しい方法...を使用して、すべてのページの列を非表示にすることができます。

于 2012-04-17T07:44:34.657 に答える
0

参照:
データベース変更のログの維持-パート1

データベースのデータへの変更の履歴を維持するには、すべての挿入、更新、および削除をある種の「履歴」テーブルに記録する必要があります。挿入、更新、または削除されたデータをキャプチャすることに加えて、どのユーザーが変更を行ったか、および変更が行われた日時も記録する必要があります。

その他のリファレンス:

変更ログ/監査データベーステーブルの最適な設計?
トリガーを使用してデータベーステーブルへの変更をログに記録する

ORM Entity Frameworkをカスタマイズするには、次のリンクを確認してください。

Entity Frameworkでデータベースのデフォルトの列値を使用するにはどうすればよいですか?
方法:変更を保存するときにビジネスロジックを実行する

于 2012-04-16T15:22:57.413 に答える
0

私が最終的に実装したソリューション:

protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
   {
      e.Values.Add("CreatedBy", HttpContext.Current.User.Identity.Name);
      e.Values.Add("CreatedDate", DateTime.Now);
    }

 protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
    {
      e.OldValues.Add("ModifiedBy", null);
      e.OldValues.Add("ModifiedDate", null);
      e.NewValues.Add("ModifiedBy", HttpContext.Current.User.Identity.Name);
      e.NewValues.Add("ModifiedDate", DateTime.Now);
   }
于 2012-04-20T15:47:37.290 に答える
0

私の解決策は、Paulの要件とは少し異なります。

DynamicData \ PageTemplates \ Insert.aspx.csファイルで、共有フィールドを持つテーブルの新しいレコードのデフォルトを表示するように編集しました。ユーザーはまだ挿入時に何か他のものを入れることができます。

public partial class Insert : System.Web.UI.Page
{
    protected MetaTable table;

    protected void Page_Init(object sender, EventArgs e)
    {
        table = DynamicDataRouteHandler.GetRequestMetaTable(Context);
        var values = table.GetColumnValuesFromRoute(Context);

        // set default values for meta data of new records across all tables
        // unknown values will be skipped
        values.Add("creationDate", DateTime.Now);
        values.Add("modificationDate", DateTime.Now);
        values.Add("modificationUser", HttpContext.Current.User.Identity.Name.Substring(
            HttpContext.Current.User.Identity.Name.IndexOf("\\") + 1));

        FormView1.SetMetaTable(table, values);
        DetailsDataSource.EntityTypeFilter = table.EntityType.Name;
    }
    [...]
}

既存の値でレコードを編集するために、いくつかのDynamicData\FieldTemplatesファイルに変更を加えました。

public partial class Text_EditField : System.Web.DynamicData.FieldTemplateUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // ...

        // show current user as value for the modification user upon editing records
        if (Column.Name == "modificationUser")
        {
            FieldValue = Page.User.Identity.Name.Substring(Page.User.Identity.Name.IndexOf("\\") + 1);
        }
    }
    [...]
}

編集用のページに更新された値が表示されますが、更新後は変更が保持されません。[ページの編集]テンプレートに追加の変更が必要です。

    protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
    {
        // make sure a meta data update is always triggered by setting a different old value
        // required for the edit components
        if (e.OldValues.Contains("modificationUser"))
        {
            e.OldValues["modificationUser"] = string.Empty;
            e.OldValues["modificationDate"] = DateTime.MinValue;
        }
    }
于 2016-01-28T13:55:35.873 に答える