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页面)
      • 文本框、组合框、标签、, 按钮等
这意味着,如果我们有一个用户页面,该页面可能有3个用户控件。一个用于用户信息(姓名、电子邮件等),一个用于地址(城市、州、邮政编码等),另一个用于区域设置(时区、语言等)

3个UserControl上的所有这些字段都存储在数据库的同一个表中

现在,我们使用数据绑定和EntityFrameworks来填充数据,这意味着当我们保存一个对象时,我们实际上调用了save 3次(每个用户控件1次)

(语言不可知论者:我们实际上不知道 分配值,如
User.Name=
“Bob”
,由框架处理)

因为UserControl只知道它包含的字段,所以当数据绑定保存它时,“认为”其他字段现在为空。(即地址控制保存,现在“Email”和“Name”为空值)。要“修复”这一问题,有一个名为“MapOldToNew”的方法,它会取出旧记录并填充即将保存的新对象上的值。这是通用的,这意味着我们在AddressUserControl上没有一个说“获取名称和电子邮件字段并填写它们”的方法,相反,它循环遍历实体(对象)的所有属性,如果新对象上的值为
NULL
,而旧对象上的值为
非NULL
(数据库中当前将被覆盖的值)它将使新值等于旧值

问题 日期。我们允许数据库中的日期为空

如果用户填写“生日”并保存,则他们现在在数据库的字段中有一个生日值。
如果他们返回并清除网页上的生日字段并保存,则
MapOldToNew
方法会抓取旧记录,发现那里的生日不是空的,并且将要保存的新对象上的生日是空的,它将用旧值覆盖新值(null)(例如“7/23/1981”)

解决?
  • 重新设计我们的系统,使其不再使用 用户控件,但具有所有 控件,从而 减少我们需要的次数 节约而不需要
    MapOldToNew
    。现在,让我们 假设这是不可能的 解决方案(即使它是 我觉得这件事该结束了 原因很多)
  • 全部存储 日期作为字符串并进行转换 加载并保存。(字符串不会 有同样的问题,因为一天一次 字符串已被修改,现在是 空字符串,且不为NULL)
  • 中不允许空日期 数据库和始终存储
    DateTime.MinValue
    且不 在加载时显示它
  • 这些都是我脑子里想出来的想法。为了论证起见,让我们假设#1是不可能的(因为我觉得管理层不喜欢完成它所需的时间)

    您将如何“修复”此问题?

    另一种解释

    下面是问题的详细说明。 用户记录有两个字段。姓名和出生日期。
    假设有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