尝试在我的ASP.NET MVC应用程序中使用DisplayForModel,但模型未显示

时间:2012-10-14 13:44:08

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

S'Ok,鉴于以下型号: -

public class SomeViewModel
{
    public IAnimal Animal { get; set; }
    public Exception Exception { get; set; } 
}

IAnimal可以是这个..

public class Cat : IAnimal { .. } 
public class Dog : IAnimal { .. }

并提供以下Razor代码

.. snip ..


@if (Model.Animal!= null)
{
    Html.DisplayForModel(Model.Animal);
}
else if (Model.Exception != null)
{
    Html.DisplayForModel(Model.Exception);
}

@Html.ActionLink("Lets go back home.", "Index")

视图不会渲染猫或狗的属性..如果模型实例是其中之一。

现在,这些模型中的每一个都只是几个字符串和bool等。所有原始类型。

所以我想,如果我只是传入模型,它应该被渲染。

任何人对我可能做过什么都有任何建议,错了吗?

另外 - 对于奖励积分,可以为这两个类中的一个创建一个显示模板 - 让我们说Cat类 - 并让它显示为instelf?例如。告诉它显示自己,而不是我手动创建Html.Label ......等等。

2 个答案:

答案 0 :(得分:0)

可以为Cat / Dog创建显示模板,(与界面不同,不能用于模板)。

您可以通过在Shared \ DisplayTemplates文件夹下创建Cat.cshtml文件来完成此操作,但在此模板中,您必须手动设置您希望此模板呈现的html。

修改 至于你的第一个问题 - 我不认为DisplayForModel是你正在寻找的,你所提出的是DisplayFor

答案 1 :(得分:0)

请记住,如果您依赖元数据注释来允许在视图中进行自动渲染(诸如属性标题,验证等),那么使用接口会有些麻烦。 MVC引擎将尝试从接口而不是具体类型中提取元数据,至少这是使用内置模板所做的。您可以通过检查具体类型并根据其类型加载元数据来覆盖模板以解决此限制。这是可行的,但我不推荐它,因为它有性能损失。