如何在ASP.NET MVC的View中使用具体的ViewModel的DataAnnotations而不是接口?

时间:2018-10-03 18:37:45

标签: c# asp.net-core-mvc

我在MVC Web应用程序中遇到一种情况,我正在使用接口的实现作为ViewModel。渲染时,视图使用接口的DataAnnotations而不是具体的类。 我的viewModels:

 public interface IAnimalViewModel
{
    [Display(Name = "InterfaceVolume")]
    int Volume { get; set; }
    int NumberOfToes { get; }
}
public class DogViewModel : IAnimalViewModel
{
    [Display(Name = "BarkVolume")]
    public int Volume { get; set; }

    public int NumberOfToes
    {
        get { return 16; }
    }
}
public class CatViewModel : IAnimalViewModel
{
    [Display(Name = "MeowVolume")]
    public int Volume { get; set; }

    public int NumberOfToes
    {
        get { return 18; }
    }
}

我观点的相关部分:

@model IAnimalViewModel
<label asp-for="Volume"></label>
@Model.NumberOfToes

结果:

  

InterfaceVolume 16

当我将DogViewModel传递给View时,我希望呈现的标签为“ BarkVolume”,但它呈现为“ Volume”,因为改用了IAnimalViewModel的DataAnnotations。与DogViewModel对象所期望的一样,NumberOfToes显示16。

有没有办法让视图使用类的DataAnnotations代替,或者我认为viewModels的方法根本有缺陷?

1 个答案:

答案 0 :(得分:0)

不确定为什么要在视图中使用界面 代替这个

@model IAnimalViewModel
<label asp-for="Volume"></label>

使用DogViewModel在视图中尝试

@Html.LabelFor(model => model.Volume)`

现在您的模型是否为IAnimalViewModel 你可能需要

@Html.LabelFor(model => (DogViewModel)model.Volume) 

//这试图将IAnimalViewModel转换为DogViewModel