我在显示模板以及处理接口和实现该接口的对象时遇到问题。在示例中,我有许多对象,我想以固定的方式呈现它们,我决定创建一个界面并在视图中引用它,我决定将其放入共享显示模板文件夹中。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
to work
@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
?
Thanks