49

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

4

4 に答える 4

61

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

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

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; }
}

その例はかなり工夫されていることを認めます...

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

于 2012-10-04T21:00:24.810 に答える
15

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

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

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

于 2012-10-04T21:05:56.610 に答える
10

利点の1つは、複数のビューで使用でき、一貫したラベルテキストを使用できることです。また、asp.net MVCスキャフォールディングでラベルテキストを生成するために使用され、意味のあるテキストを簡単に生成できるようにします。

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

「WildandCrazy」は、アプリケーションでプロパティを使用する場所に一貫して表示されます。

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

于 2012-10-04T21:01:07.907 に答える
0

また、国際化。

私はしばらく前にこれをだましました。私のモデルでこれをしました:

[Display(Name = "XXX", ResourceType = typeof(Labels))]

すべてのリソース用に個別のクラスライブラリがあったので、Labels.resx、Labels.culture.resxなどがありました。

そこには、key = XXX、value="その文化における意味のある文字列"がありました。

于 2019-11-19T20:48:49.923 に答える