我应该从我的模型中删除所有[DataType(DataType.Date)]吗



我遇到了一个问题;战斗开始日期";以及";BattleEndDate";其中没有显示在我的编辑表单上,即使在创建记录时已经在DB上设置了正确的值。"创建"one_answers"编辑"视图都使用一个公共的局部视图_BattleEditFields。

我的旧型号:

[DisplayName("Battle Start Date")]
[Required(ErrorMessage = "Enter date (mm/dd/yyy) when the battle started")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
[DataValidation(ValidationType.RangeValidation, "The battle starting date must be after 1/1/1860 and before 6/1/1865.")]
public DateTime BattleStartDate { get; set; }
[DisplayName("Battle End Date")]
[Required(ErrorMessage = "Enter date (mm/dd/yyy) when the battle ended")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
[DataValidation(ValidationType.RangeValidation, "The battle ending date must be after 1/1/1860 and before 6/1/1865.")]
[DataValidation(ValidationType.CompareDates, "The battle ending date must be equal to or greater than the start date.", compareWith: "BattleStartDate")]
public DateTime BattleEndDate { get; set; }

我注意到,在运行时,我收到了以下错误消息。错误CS0103:名称"type"在当前上下文中不存在

一旦我更新了模型,从两个字段中删除了[DataType(DataType.Date(],一切都很好。我还有其他几个日期字段,它们在模型中也有[DataType(DataType.date(](见下文(。我是否应该继续删除所有它们,即使它似乎没有造成问题??(只需返回测试更改(。

--这些是审核类型的字段,不会显示给用户--

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BattleDateAccepted { get; set; }
// --------------------------------------------------------------------------------------------
public string BattleChangedBy { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BattleDateChange { get; set; }

通常我们会建议不要这样做,但建议您在代码中尽量遵循约定和模式,因此看到一些带有此属性的Date属性而不是其他属性很容易导致混乱,一些开发人员可能会将其添加回缺失的属性中,其他开发人员可能如您所建议的那样将其从所有属性中删除。因此,这变成了一种依赖的场景。。。

首先确定使用DataType(DataType.Date)属性的原因,在MVC中,第一个原因通常是为了验证,但该属性也可以用于管理数据库架构的DBORM库,如实体框架,以确保数据库中字段的类型应为仅限日期数据类型。

  • EF还有其他可以用于相同目的的属性,在MVC应用程序中,通常使用约定来映射此属性,以降低两个属性设置为冲突值的风险

如果您使用的ORM需要此属性来管理数据库架构,那么您删除的这些属性中的每一个都可能需要在模型的其他地方设置相应的更改集,以确保数据库架构不受影响。

此属性在MVC验证文档中被大量引用,是Date输入验证的最低配置。从模型中删除此属性可能仍然允许通过API接受无效值,即使视图(由于其他验证属性而(在UI中正确生成了验证。如果您的API没有暴露给外部调用程序,则您可能不关心这一点。

当您已经确定具有此属性但未显示在UI中的字段不会导致此错误时,您应该查看您的视图代码和配置,看看您是否使用了缺少组件的第三方控制包。

当前上下文中不存在"类型">这是一个与此属性相关的常见错误,但可能发生在引用不匹配程序集的自定义控件或UI验证代码中,通常是.Net Core项目中的.Net FX UI组件,反之亦然。

在您的情况下,如果删除DataType属性解决了您的错误AND对应用程序运行时没有其他不利影响OR部署,请将其删除。如果您的模型未通过API向外部调用方公开,或者您不允许外部调用方修改其他字段,那么为了保持一致性,我建议从所有DateTime字段中删除此属性。

因为这违背了MVC对验证的正常期望,我会在模型/项目的文档中包含一条关于这一点的注释,这样你就可以记住为什么要做出这个决定。

如果您保留属性的原因不是验证,那么在将其应用于整个模型中的所有日期字段之前,您应该进一步调查以了解原因。

最新更新