我想知道是否有人可以证实这种行为或我是否做错了什么。
通常,当您指定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; }
}
}
答案 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]
。这些属性被组合用于继承的类,因此当它反映类时,它将看到这两个属性。
此视图应根据需要使用模板。我猜这不适合你,虽然我认为继承是有原因的吗?