我在显示模板以及处理实现该接口的接口和对象方面遇到问题。在示例中,我有很多对象,希望以固定的方式进行渲染,因此我决定创建一个接口,并在我决定将其放入共享显示模板文件夹的视图中引用该接口。 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正确计算出来,实际上实现了CatIPet类型应该查看公用共享视图IPet.cshtml

谢谢

最佳答案

启动一个新的MVC应用程序并修复代码以实际编译视图就可以了。将视图移到共享文件夹时,它也可以很好地呈现。

我向IPet添加了setter:

public interface IPet
{
    String Name { get; set; }
}

我更新了实现并添加了公共访问器:
public class Dog : IPet
{
    public String Name { get; set; }
}

public class Cat : IPet
{
    public String Name { get; set; }
}

我不理会您的VM,也没有更改View中的任何代码。
按F5键,运行MVC应用程序将按预期方式呈现结果(参见图片)。

07-28 05:34