mvc3のかみそりでLabelForの表示名を変更するにはどうすればよいですか?


87

かみそりエンジンでは、LabelForヘルパーメソッドを使用して名前を表示しました

しかし、表示名は表示しにくいようです。表示名を変更する必要があります。

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

これは非常に古い質問ですが、それでも現在のMVCコーディングに非常に関連しています。これまでに提供された2つのソリューションには問題があるため、利用可能な3つのオプションすべてをカバーするより詳細な回答を追加しました。
コーディングが終了し

回答:


160

ビューモデルプロパティを[DisplayName]属性で装飾し、使用するテキストを指定できます。

[DisplayName("foo bar")]
public string SomekingStatus { get; set; }

または、テキストを指定できるLabelForヘルパーの別のオーバーロードを使用します。

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

また、LabelForヘルパーがサポートしていないため、MVC3でクラス名を指定することはできません。ただし、これはMVC4または5で機能します。


@ raj2sekar1、それが働いていると、この答えは、あなたが隣にあるチェックマークをクリックして答えとして、それをマークする検討すべきであるし、問題解決に役立った場合:meta.stackexchange.com/questions/5234/...を
ダーリン・ディミトロフ

8
ただし、System.ComponentModelを使用する必要があります。
yancyn 2013年

2
これは役に立ちました、ありがとう。しかし、代わりにこれがあれば、あなたの答えはもっと良いと思います@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me 2014

2
おそらくこれは少し前に書かれましたが、今ではLabelFor内でクラス名を指定できます:例:@ Html.LabelFor(model => model.SomekingStatus、new {@class = "your-css-class"})
ra170

3
ただし、データベースを更新すると、モデルクラスが再生成され、これが失われます。どうやってそれを避けますか?
シム

30

これは古い質問でしたが、既存の回答では、モデルを再生成するときにカスタム属性を破棄するという深刻な問題は無視されています。現在利用可能なオプションをカバーするために、より詳細な回答を追加しています。

3つのオプションがあります。

  • [DisplayName("Name goes here")]データモデルクラスに属性を追加します。欠点は、データモデルを再生成するたびにこれが破棄されることです。
  • 文字列パラメータをに追加しますHtml.LabelFor。例:@Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})リファレンス:https//msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelforv = vs.118).aspxこれの欠点は、ラベルを繰り返す必要があることです。すべてのビューで。
  • 3番目のオプション。データクラスにアタッチされたメタデータクラスを使用します(詳細は以下を参照)。

オプション3-メタデータクラスを追加します。

Microsoftでは、既存のクラスを変更せずに、EntityFrameworkクラスのプロパティを装飾できます。これは、データベースクラスにアタッチするメタデータクラス(事実上、EFクラスの横方向の拡張)を持つことによるものです。これにより、属性をクラス自体ではなく関連するクラスに追加できるため、データモデルを再生成するときに変更が失われることはありません

あなたのデータクラスがある場合たとえば、MyModelSomekingStatus財産、あなたはこのようにそれを行うことができます:

最初に、同じ名前の(そして同じ名前空間を使用する)部分クラスを宣言します。これにより、オーバーライドせずにクラス属性を追加できます。

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

生成されたすべてのデータモデルクラスは部分クラスであり、同じ名前のクラスをさらに作成するだけでプロパティとメソッドを追加できます(これは非常に便利で、モデル内の他のフィールドタイプのフォーマットされた文字列バージョンを提供するためによく使用します)。

ステップ2:新しい部分クラスによって参照されるmetatadataクラスを追加します。

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

参照: https //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v = vs.110).aspx

ノート:

  • メモリから、メタデータクラスの使用を開始すると、実際のクラス([required]など)の既存の属性が無視される可能性があるため、メタデータクラスの属性を複製する必要がある場合があります。
  • これは魔法では機能せず、どのクラスでも機能するだけではありません。UI装飾属性を検索するコードは、最初にメタデータクラスを検索するように設計されています。

これがASP.NETCore 3.1で機能しない理由はありますか?[必須]は機能しますが、[DisplayName( "my label")]は機能しません
John Pasquet

15

プロパティをDisplayName属性で装飾することにより、ラベルのテキストを変更できます。

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

または、生のHTMLを明示的に記述することもできます。

<label for="SomekingStatus" class="control-label">Someking Status</label>

1
@shim:ビュー内のデータベース/ドメインモデルクラスを直接操作するべきではありません。通常、その間に中間の「view-model」クラスがあります。
vman 2015年

まさに私がラベル構文を使用して探していたもの..ありがとう@ xander–
Asif Iqbal

1
「生のHTMLを明示的に書く」ことの問題は、そのフォームを使用するたびに自分でラベルを書かなければならないことです。モデルでdeDisplayNameを宣言することをお勧めします。
セザール・レオン

4

DisplayName属性を使用してモデルプロパティを装飾します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.