ASP.NET站点体系结构问题
由于我正在设计的网站的性质,我现在必须解决一个问题。ASP.NET站点体系结构问题,asp.net,language-agnostic,architecture,Asp.net,Language Agnostic,Architecture,由于我正在设计的网站的性质,我现在必须解决一个问题。 我将尝试以独立于语言的方式编写此问题,但该站点是在ASP.Net中使用C#完成的 概述 对于任何给定的“对象”,我们网站的结构如下所示: ASPX页 多个用户控件(ascx页面) 文本框、组合框、标签、, 按钮等 这意味着,如果我们有一个用户页面,该页面可能有3个用户控件。一个用于用户信息(姓名、电子邮件等),一个用于地址(城市、州、邮政编码等),另一个用于区域设置(时区、语言等) 3个UserControl上的所有这些字段都存储
我将尝试以独立于语言的方式编写此问题,但该站点是在ASP.Net中使用C#完成的 概述 对于任何给定的“对象”,我们网站的结构如下所示:
- ASPX页
- 多个用户控件(ascx页面)
- 文本框、组合框、标签、, 按钮等
- 多个用户控件(ascx页面)
User.Name=
“Bob”
,由框架处理)
因为UserControl只知道它包含的字段,所以当数据绑定保存它时,“认为”其他字段现在为空。(即地址控制保存,现在“Email”和“Name”为空值)。要“修复”这一问题,有一个名为“MapOldToNew”的方法,它会取出旧记录并填充即将保存的新对象上的值。这是通用的,这意味着我们在AddressUserControl上没有一个说“获取名称和电子邮件字段并填写它们”的方法,相反,它循环遍历实体(对象)的所有属性,如果新对象上的值为NULL
,而旧对象上的值为非NULL
(数据库中当前将被覆盖的值)它将使新值等于旧值
问题
日期。我们允许数据库中的日期为空
如果用户填写“生日”并保存,则他们现在在数据库的字段中有一个生日值。如果他们返回并清除网页上的生日字段并保存,则
MapOldToNew
方法会抓取旧记录,发现那里的生日不是空的,并且将要保存的新对象上的生日是空的,它将用旧值覆盖新值(null)(例如“7/23/1981”)
解决?
MapOldToNew
。现在,让我们
假设这是不可能的
解决方案(即使它是
我觉得这件事该结束了
原因很多)DateTime.MinValue
且不
在加载时显示它假设有1个ASPX页面和2个用户控件(ascx)。
UserControl1有一个绑定到“生日”的日期选择器数据。
UserControl2有一个单独的文本框数据绑定到“Name”。
当UserControl1在ObjectContext上调用Update时,它发送的用户对象如下所示:
{ Name = NULL, BirthDate = 8/13/1980 }
{ Name = "John", BirthDate = NULL }
MapOldToNew查看数据库记录,发现名称应为“Bob”,因此它将值填入其中,并保存记录
UserControl2调用Update now,用户对象如下所示:
{ Name = NULL, BirthDate = 8/13/1980 }
{ Name = "John", BirthDate = NULL }
MapOldToNew看到BirthDate为NULL,因此它将从数据库中用1980年8月13日覆盖它,记录将保存,并且数据库具有正确的值
现在假设用户返回并删除出生日期值。当UserControl2调用MapOldToNew时,它会看到出生日期为NULL(用户需要),并从数据库中覆盖它。如果它没有从数据库中覆盖它,它将始终将其保存为NULL,用户将永远无法设置出生日期。我将重构MapOldToNew以了解可为NULL的类型。我假设您有一个可为NULL的日期(例如datetime?或可为NULL,如果是,请不要假设为NULL进行覆盖)
此外,考虑MVC或WebFras考虑动态数据,因为类型与模型之间的映射。
当然,这个问题与语言无关。否则,如果您在VB.NET中编程,可能不会遇到完全相同的问题。是的,但它也有点与ASP.NET无关。从MVC模式的角度来看。一个视图有多个子视图,所有子视图都调用同一个控制器。保存时使用部分填充d模型,所以他们都调用MapOldToNew,它用数据库中的值覆盖空日期。你的问题是
MapOldToNew
-函数。我不熟悉实体框架,但必须能够从数据库中加载旧值,覆盖UC中的列并保存它。如果可能的话会更好(不是吗?)。在谷歌搜索了几分钟后,我发现了。看看这段视频:@Tim-这可能是一个值得一看的东西,但它需要在100多个UserControlsYes上手动填充大约50多个实体,但在这种情况下,您将如何重构MapOldToNew?如果更新实体上的日期为NULL,我们如何知道它是否为NULL,因为用户将其屏蔽,或者如果它是空的,因为它不在调用Update的UserControl中?如果您总是执行al