1

我想知道是否有人可以确认这种行为,或者我是否做错了什么。

通常,当您指定DataType(DataType.MultilineText)属性并执行@Html.DisplayFor(m => m.Body)MVC 之类的操作时,将使用 DisplayTemplates 文件夹中的 MultilineText.cshtml。DataType当属性应用于覆盖的属性时,这似乎不起作用,如下面的代码所示。现在,如果我将属性移动到抽象类中的属性,它 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; }
    }
}
4

1 回答 1

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]。这些属性是为继承的类组合的,因此当它反映该类时,它将看到这两个属性。

此视图应根据需要使用模板。我猜这对你不起作用,因为我假设继承是有原因的?

于 2014-04-29T13:20:22.897 回答