I have a situation in my MVC webapp where I'm using an implementation of an interface as my ViewModel. While rendering, the view uses the DataAnnotations of the interface instead of the concrete class. My 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; }
}
}
Relevant part of my view:
@model IAnimalViewModel
<label asp-for="Volume"></label>
@Model.NumberOfToes
Result:
InterfaceVolume 16
I would expect the rendered label to be "BarkVolume" when I pass a DogViewModel
to my View, but it renders "Volume", because the DataAnnotations of IAnimalViewModel are used instead. NumberOfToes show 16, as expected from a DogViewModel
object.
Is there a way to have the view use the class's DataAnnotations instead, or is my way of thinking about viewModels fundamentally flawed?