在单独项目中使用域 类 的 ASP.NET MVC 应用程序中正确使用 DataAnnotations?
Proper use of DataAnnotations in a ASP.NET MVC app with Domain classes in a separate project?
我有一个 N 层应用程序,其中数据层、域层和前端层位于不同的项目中。我正在使用 ASP.NET MVC 创建网站,我正在尝试使用 System.ComponentModel.DataAnnotations 添加验证规则。目前我已经在域 类' 属性上完成了它。
我想知道将验证规则直接应用于域 类 是否是一种好的做法?或者最好在 ASP.NET 应用程序中创建 ViewModels 类 并将验证规则应用于 ViewModel 类 的属性?
希望这个问题适合这里
感谢您的帮助。
ViewModel 要好得多,因为 ViewModel 应该了解它是否从用户那里获得了有效输入。然后您可以使用 AutoMapper 修复转换期间的所有其他异常。我还会创建很多自定义、DataAnnotations、DataTypes、Editors、ModeMetaDataRules 和 ModelBinder 来配合应用程序。
这是使用自定义 ModelBuilder 的 ModelFilter 的部分代码,我将使用其中的 post 部分,因为涉及的代码很多,但它应该能让您走上正轨。
public interface IModelMetadataFilter
{
void TransformMetadata(ModelMetadata metadata,
IEnumerable<Attribute> attributes);
}
public class MultilineTextByNameConvention : IModelMetadataFilter
{
public void TransformMetadata(ModelMetadata metadata, IEnumerable<Attribute> attributes)
{
if ( !string.IsNullOrEmpty(metadata.PropertyName) &&
string.IsNullOrEmpty(metadata.DataTypeName) )
{
if ( metadata.PropertyName.ToLower().Contains("notes")
|| metadata.PropertyName.ToLower().Contains("description")
|| metadata.PropertyName.ToLower().Contains("comment")
)
{
metadata.DataTypeName = DataType.MultilineText.ToString();
}
}
}
}
此代码查找名称为 属性 且包含单词 'notes'、'description' 和 'comment' 的每个 ViewModel,自动为所有这些属性应用 Multitext DataType 属性。这种类型的代码可用于许多其他不同的情况。例如,像 SSN 这样的字段可以使用 RexExpr DataAnnotation 具有特定格式,等等...
您可以在部分 类 实体上设置属性,并且您自动生成的 类 不会被覆盖。
例如,
假设您有实体 TheEntity
在具有相同命名空间的单独文件中,您可以编写:
namespace SameNamespaceAsEntities
{
internal sealed class TheEntityMetadata
{
//AStringInTheEntity appears twice in your project
//once in the auto gen file, and once here
[Required(ErrorMessage = "Field is required.")]
public string AStringInTheEntity{ get; set; }
}
//
[System.ComponentModel.DataAnnotations.MetadataType(typeof(TheEntityMetadata))]
public partial class TheEntity : IEntity //you can set contracts
{
我有一个 N 层应用程序,其中数据层、域层和前端层位于不同的项目中。我正在使用 ASP.NET MVC 创建网站,我正在尝试使用 System.ComponentModel.DataAnnotations 添加验证规则。目前我已经在域 类' 属性上完成了它。 我想知道将验证规则直接应用于域 类 是否是一种好的做法?或者最好在 ASP.NET 应用程序中创建 ViewModels 类 并将验证规则应用于 ViewModel 类 的属性? 希望这个问题适合这里 感谢您的帮助。
ViewModel 要好得多,因为 ViewModel 应该了解它是否从用户那里获得了有效输入。然后您可以使用 AutoMapper 修复转换期间的所有其他异常。我还会创建很多自定义、DataAnnotations、DataTypes、Editors、ModeMetaDataRules 和 ModelBinder 来配合应用程序。
这是使用自定义 ModelBuilder 的 ModelFilter 的部分代码,我将使用其中的 post 部分,因为涉及的代码很多,但它应该能让您走上正轨。
public interface IModelMetadataFilter
{
void TransformMetadata(ModelMetadata metadata,
IEnumerable<Attribute> attributes);
}
public class MultilineTextByNameConvention : IModelMetadataFilter
{
public void TransformMetadata(ModelMetadata metadata, IEnumerable<Attribute> attributes)
{
if ( !string.IsNullOrEmpty(metadata.PropertyName) &&
string.IsNullOrEmpty(metadata.DataTypeName) )
{
if ( metadata.PropertyName.ToLower().Contains("notes")
|| metadata.PropertyName.ToLower().Contains("description")
|| metadata.PropertyName.ToLower().Contains("comment")
)
{
metadata.DataTypeName = DataType.MultilineText.ToString();
}
}
}
}
此代码查找名称为 属性 且包含单词 'notes'、'description' 和 'comment' 的每个 ViewModel,自动为所有这些属性应用 Multitext DataType 属性。这种类型的代码可用于许多其他不同的情况。例如,像 SSN 这样的字段可以使用 RexExpr DataAnnotation 具有特定格式,等等...
您可以在部分 类 实体上设置属性,并且您自动生成的 类 不会被覆盖。
例如,
假设您有实体 TheEntity
在具有相同命名空间的单独文件中,您可以编写:
namespace SameNamespaceAsEntities
{
internal sealed class TheEntityMetadata
{
//AStringInTheEntity appears twice in your project
//once in the auto gen file, and once here
[Required(ErrorMessage = "Field is required.")]
public string AStringInTheEntity{ get; set; }
}
//
[System.ComponentModel.DataAnnotations.MetadataType(typeof(TheEntityMetadata))]
public partial class TheEntity : IEntity //you can set contracts
{