我在 ASP.NET 动态数据 Web 应用程序中工作,并且在插入/更新记录时遇到了传递默认值的问题。在我的应用程序中,所有表都有以下公共列:
- CreatedBy(默认值:登录用户)
- CreatedDate(默认值:DateTime.Now)
- modifiedBy(默认值:登录用户)
- 修改日期(默认值:DateTime.Now)
我想将这些列隐藏在页面中Insert
,Edit
并希望将默认值自动插入相应的列中。
请给我建议。
谢谢保罗
我在 ASP.NET 动态数据 Web 应用程序中工作,并且在插入/更新记录时遇到了传递默认值的问题。在我的应用程序中,所有表都有以下公共列:
我想将这些列隐藏在页面中Insert
,Edit
并希望将默认值自动插入相应的列中。
请给我建议。
谢谢保罗
我看到您正在做简单的审计,请查看我的博客文章,使用 Entity Framework 4.x 对动态数据进行基本审计,希望对您有所帮助。
在页面中做这种事情从来都不是一件好事,最好在你的数据模型/层中做。您可以使用我的 A New Way To Do Column Generation in Dynamic Data ...隐藏所有页面中的列。
为了维护数据库数据更改的历史记录,我们需要将每次插入、更新和删除记录到某种“历史”表中。除了捕获插入、更新或删除的数据之外,我们还需要记录修改的用户,以及修改的日期和时间。
更多参考:
变更日志/审计数据库表的最佳设计?
使用触发器记录对数据库表的更改
要自定义 ORM 实体框架,请检查以下链接:
我最终实施的解决方案:
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);
}
我的解决方案与保罗的要求有点不同。
在文件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;
}
}