1

誰かがこの動作を確認できるかどうか、または私が何か間違ったことをしたかどうか疑問に思っています。

通常、属性を指定すると、 MVC のDataType(DataType.MultilineText)ような操作を行うと、DisplayTemplates フォルダー内の MultilineText.cshtml が使用されます。以下のコードのように、オーバーライドされたプロパティに属性が適用されて@Html.DisplayFor(m => m.Body)いる場合、これは機能しないようです。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

2 番目のものが適用され[StringLength(500), DataType(DataType.MultilineText)] ます [Required]。継承されたクラスの属性は結合されるため、クラスを反映すると両方の属性が表示されます。

このビューでは、必要に応じてテンプレートを使用する必要があります。何らかの理由で継承が存在すると推測しているので、これはうまくいかないと思いますか?

于 2014-04-29T13:20:22.897 に答える