0

我有一个N层应用程序,其中Data,Domain和前端图层位于不同的项目中。我正在使用ASP.NET MVC创建网站,我试图通过使用System.ComponentModel.DataAnnotations来添加验证规则。目前我已经完成了域类的属性。 我想知道将验证规则直接应用于Domain类是否是一种好的做法?或者最好在ASP.NET应用程序中创建ViewModels类并将验证规则应用于ViewModel类的属性? 希望这个问题适合在这里 我感谢任何帮助。正确使用ASP.NET MVC应用程序中的DataAnnotations以及单独项目中的Domain类?

+3

最好创建的ViewModels –

+0

@BrianOgden非常感谢你的帮助。然后我将使用automapper来映射Domain类以查看模型类。如果我可以问,有什么更好的建议? – arvind

回答

1

ViewModel要好得多,因为ViewModel应该理解它是否能够从用户那里获得有效的输入。然后,您可以使用AutoMapper在转换过程中修复所有其他异常。我还会创建大量自定义,DataAnnotations,DataTypes,编辑器,ModeMetaDataRules和ModelBinder以与应用程序一起使用。

下面是使用自定义模型构建器的ModelFilter的部分代码,我将发布其中的一部分,因为涉及到很多代码,但它应该让您处于正确的轨道上。

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(); 
       } 
      } 
     } 
    } 

此代码查找具有包含单词“注释”,“说明”和“注释”,自动应用Multitext数据类型属性为所有属性的属性名称每个视图模型。这种类型的代码可以用于很多其他不同的情况。例如像SSN这样的字段可以使用RexExpr DataAnnotation的特定格式,依此类推...

+0

非常感谢您的帮助。我很感激 – arvind

+0

感谢您添加代码段。您的回答正是我想要的:) – arvind

1

您可以在实体的部分类上设置属性,并且自动生成的类不会被覆盖。

例如,

比方说,你有实体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; } 
} 

//http://stackoverflow.com/questions/14059455/adding-validation-attributes-with-an-entity-framework-data-model 
[System.ComponentModel.DataAnnotations.MetadataType(typeof(TheEntityMetadata))] 
public partial class TheEntity : IEntity //you can set contracts 
{ 
+0

非常感谢您的帮助 – arvind

+0

@Ssheverdin提供的解决方案出了什么问题?另外,我不确定我是否了解您的建议是诚实的。请详细解释我的域名我需要应用数据注释而不涉及模型类。让我说我有一个名为Name的属性,我想应用[StringLength]。如果另一个项目想要使用我的域项目DLL并且不会需要StringLength限制。因此,Ssheverdin在这里提供的解决方案听起来很合理。但我仍然乐于接受建议。直到那时我会尊敬地选择Ssheverdin解决方案。 – arvind

相关问题