加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET站点架构问题

发布时间:2020-12-16 09:35:13 所属栏目:asp.Net 来源:网络整理
导读:由于我正在设计的网站的设计方式的性质,我有一个问题,我现在必须解决. 我将尝试将此问题编写为与语言无关的问题,但该站点是使用C#在ASP.Net中完成的. 概观 对于任何给定的“对象”,我们网站的结构如下所示: ASPX页面 多个UserControls(ascx页面) 文本框,组
由于我正在设计的网站的设计方式的性质,我有一个问题,我现在必须解决.
我将尝试将此问题编写为与语言无关的问题,但该站点是使用C#在ASP.Net中完成的.

概观

对于任何给定的“对象”,我们网站的结构如下所示:

> ASPX页面

>多个UserControls(ascx页面)

>文本框,组合框,标签,
按钮等

这意味着,如果我们有一个用户页面,那么该页面可能有3个UserControls.一个用于用户信息(姓名,电子邮件等),一个用于地址(城市,州,邮编等),一个用于区域设置(时区,语言等)

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

现在,我们使用DataBinding和EntityFrameworks来填充数据,这意味着当我们保存对象时,我们实际上正在调用save 3次(每个UserControl 1次).

(Language-Agnostic: We don’t actually
assign values like User.Name =
"Bob"
,it is handled by a Framework)

因为UserControl只知道它包含的字段,所以当数据绑定保存它“认为”时,其他字段现在都是空白的. (即地址控制保存,现在“电子邮件”和“名称”为空值).为了“修复”这个,有一个名为“MapOldToNew”的方法,该方法熄灭并抓取旧记录并填写即将保存的New对象的值.这是通用的,这意味着我们在地址用户控件上没有一个方法,即“获取名称和电子邮件字段并将其填入”,而是循环遍历实体(对象)的所有属性,如果是值在New对象上为NULL但在Old对象上是NOT NULL(当前在数据库中将要覆盖的对象),它将使New值等于Old值.

问题

日期.我们在数据库中允许NULL日期.

如果用户填写“生日”并保存,则他们现在在数据库的字段中具有生日值.
如果他们返回并清除网页上的生日字段并保存,则MapOldToNew方法会抓取旧记录,看到生日不为空,并且在要保存的新对象上为空,它将覆盖新值(NULL)与旧值(例如’7/23/1981′).

解决方案?

>重做我们的系统不使用
UserControls,但所有
因此,控制在同一页面上
减少我们需要的次数
保存而不是要求
MapOldToNew.现在,我们来吧
假设这是不可能的
解决方案(即使它是一个
我觉得应该这样做
很多理由).
>全部存储
将日期作为字符串并进行转换
加载和保存. (字符串没有
有同样的问题,因为曾经
字符串已被修改它现在
一个空字符串,而不是NULL)
>不要允许NULL日期
数据库并始终存储
DateTime.MinValue而不是
显示它在负载.

这些是我脑子里想出的想法.为了论证,让我们假设#1是不可能的(因为我觉得管理层不会喜欢完成所需的时间).

你会如何“修复”这个?

另一种解释

这是解决问题的更多问题.
用户记录有2个字段.姓名和出生日期.
假设有一个ASPX页面有2个UserControls(ascx).
UserControl1有一个DatePicker DataBound为“BirthDate”.
UserControl2有一个TextBox DataBound为“Name”.
当UserControl1在ObjectContext上调用Update时,它发送的User对象如下所示:

{ Name = NULL,BirthDate = 8/13/1980 }

MapOldToNew查看数据库记录并看到Name应该是“Bob”,因此它填充了值并保存了记录.

UserControl2现在调用Update,User对象如下所示:

{ Name = "John",BirthDate = NULL }

MapOldToNew看到BirthDate为NULL,因此它从数据库中用8/13/1980覆盖它,并且记录保存并且数据库具有正确的值.

现在假设用户返回并删除BirthDate值.当UserControl2调用MapOldToNew时,它会看到BirthDate为NULL(用户想要的)并从数据库中覆盖它.
如果它不从数据库覆盖它,它将始终将其保存为NULL,并且用户将永远无法设置BirthDate.

解决方法

我会重构MapOldToNew来理解可空类型.我假设您有一个可以为空的日期(例如,日期时间?或Nullable,如果是这样的话 – 如果为空则不要假设覆盖.

同样在将来考虑MVC或WebForms考虑动态数据,因为类型映射到模型.
http://aspnet.codeplex.com/wikipage?title=Dynamic%20Data

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读