web-dev-qa-db-ja.com

MVC 4データアノテーションの「表示」属性

MVC 4(Razorビューエンジン)から始めています。 (これはMVC 3以前にも当てはまると思います。)HTMLで直接文字列を書くよりも、ビュー内でDisplayAttributeデータアノテーションを使用することに利点があるのか​​疑問に思います。たとえば、次のモデルがあった場合:

public class Thing
{
    public string WildAndCrazyProperty { get; set; }
}

...プロパティに次のように注釈を付けることには利点がありますか?

    [Display(Name = "Wild and Crazy")]
    public string WildAndCrazyProperty { get; set; }

...そして、私のマークアップを持つこと:

<html>
    <body>
        <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>

...対して注釈を持たず、以下を実行します。

<html>
    <body>
        <div>Wild and Crazy</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>

この場合Html.LabelForについて言及しなかった理由は、プロパティのデータがページ上に静的な(編集不可能な)テキストとして表示されているためです。このページでデータは編集できないため、2番目の<div>内でHtml.TextBoxForを使用し、その後Html.LabelForを使用してラベルをそのテキストボックスに適切に関連付ける必要はありません。

46
Kenneth K.

2つの異なるビューが同じモデルを共有している場合(たとえば、1つはモバイル出力用で、もう1つは通常のもの)、ViewModelのメタデータとして、文字列を1か所に配置すると良いでしょう。

さらに、別の表示を必要とするモデルの継承バージョンがある場合、それは役に立つかもしれません。例えば:

public class BaseViewModel
{
    [Display(Name = "Basic Name")]
    public virtual string Name { get; set; }
}

public class OtherViewModel : BaseViewModel
{
    [Display(Name = "Customized Inherited Name")]
    public override string Name { get; set; }
}

私はその例がかなり不自然であることを認めます...

これらは、私が思いつくことができる属性を使用することを支持する最良の議論です。私の個人的な意見では、ほとんどの場合、そのようなことはマークアップに任せるのが最善です。

55
eouw0o83hf

他の回答に加えて、フィールドをローカライズするときにDisplayAttributeを使用することには大きな利点があります。 DisplayAttributeを使用してローカライズデータベースで名前を検索でき、希望する翻訳を使用します。

また、Html.EditorForModel()を使用してMVCにテンプレートを生成させると、正しいラベルが生成されます。

最終的に、それはあなた次第です。しかし、MVCは非常に「モデル中心」であるため、データ属性がモデルに適用されるため、メタデータは1か所に存在します。それはあなたがしなければならない余分なタイピングの膨大な量のようではありません。

13

利点の1つは、複数のビューで使用でき、一貫したラベルテキストを使用できることです。また、ラベルテキストを生成するためにasp.net MVCの足場によって使用され、意味のあるテキストの生成を容易にします。

[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }

「Wild and Crazy」は、アプリケーションでプロパティを使用する場所に常に表示されます。

一部のビューでテキストを変更したい場合があるため、これは柔軟ではない場合があります。その場合、2番目の例のようにカスタムマークアップを使用する必要があります

8
codingbiz