У меня проблема с шаблонами отображения и с интерфейсами и объектами, которые реализуют интерфейс.В этом примере у меня есть много объектов, которые я хочу отображать фиксированным способом, я решил создать интерфейс и ссылаться на него в виде, который я решил поместить в папку общих шаблонов отображения.DisplayFor
не работает для объектов, переданных ему, которые реализуют интерфейс в представлении, кто-нибудь знает решение этой проблемы.
Его, вероятно, легче объяснить с помощью кода, поэтому я написалбыстрый пример.Базовый интерфейс и два класса, которые наследуются от него:
public interface IPet
{
String Name { get; }
}
public class Dog : IPet
{
public String Name { get; set; }
}
public class Cat : IPet
{
public String Name { get; set; }
}
Пример шаблона отображения в общих шаблонах отображения
@model IPet
<div>@Model.Name</div>
Пример модели представления, передаваемой в представление
public class VM
{
public IPet Master { get; set; }
public IEnumerable<IPet> Minions { get; set; }
}
Контроллер (в данном случае для создания фиктивной информации)
public ActionResult Index()
{
var viewModel = new VM();
viewModel.Master = new Cat(){Name = "Fluffy"};
var minions = new List<IPet>();
minions.Add(new Dog(){Name = "Dave"});
minions.Add(new Dog(){Name = "Pete"});
minions.Add(new Cat(){Name = "Alice"});
viewModel.Minions = minions;
return View(viewModel);
}
и, наконец, представление, которое я ожидал бы DisplayFor
, будет работать
@model ViewInheritance.Models.VM
<h2>Master</h2>
@Html.DisplayFor(x => x.Master)
<h2>Minions</h2>
@Html.DisplayFor(x => x.Minions)
Учитывая, чтовсе объекты определены в модели представления как интерфейсы, как получается, что не удается использовать шаблон отображения?
Одно решение, которое я нашел, это просто использовать код
@Html.DisplayFor(x => x.Master, "IPet")
.Напомним, вопрос:
Почему это происходит?Есть ли способ заставить DisplayFor
правильно определить, что тип Cat
, который реализует IPet
, должен на самом деле смотреть на общий общий вид IPet.cshtml
?
Спасибо