在单独项目中使用域 类 的 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
{