StringLengthとMaxLengthの属性ASP.NET MVCとEntity Framework EF Code First


152

[MaxLength][StringLength]属性の動作の違いは何ですか?

私が知る限りでは([MaxLength]配列の最大長を検証できることを除いて)、これらは同一で多少冗長ですか?


1
私は、ASP.NET MVCについてはよく分からないが、EFのためには差があってはならない:stackoverflow.com/questions/5414611/...
ラディスラフMrnka

1
stringLengthを変更しても、マイグレーションのcolサイズには影響しません。
Cas Bloem

@CasBloem StringLengthは実際にはEntityFrameworkによって取得され、列の長さに影響を及ぼします-少なくともバージョン6では
jakejgordon

回答:


203

MaxLengthは、Entity Frameworkがデータベースを作成するときに文字列値フィールドを作成する大きさを決定するために使用されます。

MSDNから:

プロパティで許可される配列または文字列データの最大長を指定します。

StringLengthは、ユーザー入力の検証に使用されるデータ注釈です。

MSDNから:

データフィールドで許可される文字の最小長と最大長を指定します。


10
また、デフォルトではMVC 3は認識されませんがMaxLengthAttribute、EFは認識しますStringLengthAttribute
marcid

15
したがって、EFでStringLengthを使用でき、文字列フィールドのサイズも推測できるため、MaxLengthは実際には必要ありません。なぜ彼らはMaxLengthを作成したのですか?
Matt Johnson-Pint 2011

4
@MattJohnson-新しいMaxLength属性を作成する決定はセマンティクスのためだったと思います。StringLengthは文字列データを意味しますが、MaxLengthはバイナリデータにも適用できます。しかし、地獄は不便なので確かです。
Josh

1
@MartinSmith-StringLengthを試してみましたが、それはうまくいきました。EF6RC1を使用しているので、コメントが正しいとは思いません
Colin

5
では[MaxLength]、なぜErrorMessageがあるのですか?
Zapnologica

46

別の投稿から学んだが、ドキュメントが見つからないように思われる、迅速で非常に役立つ追加情報(MSDNでリンクを共有できる人がいるとすれば、すばらしいでしょう):

これらの属性に関連付けられた検証メッセージは、実際には属性に関連付けられたプレースホルダーを置き換えます。例えば:

[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }

文字数制限を超えている場合、 「住所の最大文字数は100文字です」と出力されます。

私が知っているプレースホルダーは次のとおりです。

  • {0} =プロパティ名
  • {1} =最大長
  • {2} =最小長

最初にこれを指摘してくれたbloudraakに感謝します。


12

[MaxLength][StringLength]属性の両方を使用した場合の結果は次のとおりEF code firstです。両方を使用すると[MaxLength]、レースに勝ちます。studentname以下のクラスの列のテスト結果を参照してください

 public class Student
 {
    public Student () {}

    [Key]
    [Column(Order=1)]
    public int StudentKey { get; set; }

    //[MaxLength(50),StringLength(60)]    //studentname column will be nvarchar(50)
    //[StringLength(60)]    //studentname column will be nvarchar(60)
    [MaxLength(50)] //studentname column will be nvarchar(50)
    public string StudentName { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
 }

7

すべての良い答え...検証の観点から、MaxLengthはサーバー側でのみ検証されますが、StringLengthはクライアント側でも検証されることに気付きました。




1

私のコンテキストに以下の行を追加して解決しました:

modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);

どういうわけか、[MaxLength]私にはうまくいきませんでした。


0

この属性を使用して、Webページ上のフォームからのテキストの最大入力長を制限する場合、StringLengthはmaxlength html属性を生成するようです(少なくともMVC 5を使用したテストでは)。選択するものは、これがテキストの最大長であることをユーザーに警告する方法に依存します。stringlength属性を使用すると、ユーザーは許可されている長さを超えて入力することはできなくなります。maxlength属性はこのhtml属性を追加せず、代わりにデータ検証属性を生成します。つまり、ユーザーは指定された長さを超えて入力でき、それ以上の入力を防ぐことは、次のフィールドに移動するか[送信]をクリックしたときのJavaScriptの検証に依存します(またはJavaScriptが無効になっている場合は、サーバー側の検証)。この場合、エラーメッセージによって制限をユーザーに通知できます。

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