.net核心数据注释显示名称-继承到viewmodels

时间:2019-05-15 19:26:45

标签: c# .net-core data-annotations

我试图创建一个ASP.NET应用程序,并在实体类模型中使用DataAnnotations来获得更易读的显示名称:

在我的ApplicationDomain项目中

public class Car{
    public int Id { get; set; }
    [Display(Name = "Make of Car")]
    public string Make { get; set; }

    [Display(Name = "Year of Purchase")]
    public int PurchaseYear { get; set; }

}

然后将其用作视图模型时,所有内容均按预期显示。

但是当我使用视图模型时,我不得不再次添加注释,因为最初添加到Car的显示名称不是基于该视图模型的“继承”。

在我的WebMVC项目中

public class EditCarViewModel{

    [Display(Name = "Make of Car")]
    public string Make { get; set; }

    [Display(Name = "Year of Purchase")]
    public int PurchaseYear { get; set; }
}

使用视图模型而不是Car Class的创建,索引和任何其他视图相同。

无论如何,初始实体类模型中的注释是否会继承/传播到相关的视图模型中,这样我就不必在多个地方这样做?

如果我然后尝试添加其他UI项目,那么我认为这将是一个更大的问题。例如WebMVC之外的桌面应用程序。

如果两者的标签都可以基于ApplicationDomain项目中的定义,那将是理想的选择。

2 个答案:

答案 0 :(得分:1)

您可以尝试创建新的元数据类并将其应用于其他人。

[MetadataType(typeof(CarModelMetaData))]
public class EditCarViewModel{
    public string Make { get; set; }.
    public int PurchaseYear { get; set; }
}

[MetadataType(typeof(CarModelMetaData))]
public class CreateCarViewModel{
    public string Make { get; set; }
    public int PurchaseYear { get; set; }
}

public class CarModelMetaData{

    [Display(Name = "Make of Car")]
    public string Make { get; set; }

    [Display(Name = "Year of Purchase")]
    public int PurchaseYear { get; set; }
}

答案 1 :(得分:0)

无法将注释文本从一个类传播到另一个类。

但是,如果您只想将同一文本保留在一个位置,则可以创建常量并以这种方式使用它们:

public static class DisplayConstants
{
    public const string Make = "Make of Car";
    public const string PurchaseYear = "Year of Purchase";
}

public class EditCarViewModel{

    [Display(Name = DisplayConstants.Make)]
    public string Make { get; set; }

    [Display(Name = DisplayConstants.PurchaseYear)]
    public int PurchaseYear { get; set; }
}

public class Car
{
    public int Id { get; set; }

    [Display(Name = DisplayConstants.Make)]
    public string Make { get; set; }

    [Display(Name = DisplayConstants.PurchaseYear)]
    public int PurchaseYear { get; set; }
}

请注意,通过这种方式,您可以按照自己喜欢的方式在EditCarViewModelCar中命名属性,而对一致的命名没有任何限制。