使用DisplayFor时,MVC忽略覆盖模型属性上的DataType

时间:2014-04-29 13:14:23

标签: asp.net-mvc razor data-annotations display-templates

我想知道是否有人可以证实这种行为或我是否做错了什么。

通常,当您指定DataType(DataType.MultilineText)属性并执行@Html.DisplayFor(m => m.Body)之类的操作时,MVC将使用DisplayTemplates文件夹中的MultilineText.cshtml。当DataType属性应用于overriden属性时,这似乎不起作用,如下面的代码所示。现在,如果我将属性移动到抽象类中的属性,MVC就会使用MultilineText.cshtml显示模板。

public abstract class PostBase
{
    [Required]
    public virtual string Body { get; set; }
}

public class MessagePost : PostBase
{
    [StringLength(500), DataType(DataType.MultilineText)]
    public override string Body
    {
        get { return base.Body; }
        set { base.Body = value; }
    }
}

1 个答案:

答案 0 :(得分:1)

您视图中声明的模型是什么?摘要还是孩子?

它使用反射根据声明的模型读取属性:

@model PostBase

@Html.DisplayFor(m => m.Body)

将以不同的方式工作

@model MessagePost

@Html.DisplayFor(m => m.Body)

其中第一个仅适用[Required]。它绑定到PostBase模型(不知道或关心子类),所以当它反映PostBase类时;这个属性只有[Required]。所以它永远不会寻找MultilineText.cshtml,为什么会这样?它上面没有MultilineText

第二个将应用[StringLength(500), DataType(DataType.MultilineText)] [Required]。这些属性被组合用于继承的类,因此当它反映类时,它将看到这两个属性。

此视图应根据需要使用模板。我猜这不适合你,虽然我认为继承是有原因的吗?