1

モデルのメタデータを取得する方法に関係する、MVC3 の予期しない動作を追跡しています。

システムの 2 つの異なる領域で収集される一部のデータに同じ EditorTemplate を使用することについて、開発者の 1 人と以前に話しました。[必須] 属性を除いて、データ フィールドはほとんど同じです。あるページでは特定のフィールドが必須であり、別のページでは必須ではありません。理論的には、これは、各フィールドに共通の属性を持つ基本モデルを使用し、それらのモデルを継承し、プロパティをオーバーライドし、追加の検証属性を追加することで実現できます。例えば:

class BaseModel
{
    [Display(Name=”My Label”)]
    public virtual string MyLabel { get; set ;}
}

class RequiredModel : BaseModel
{
    [Required]
    public override string MyLabel { get; set ;}
}

次に、View を BaseModel に厳密に型指定できます。ビューで @Html.EditorFor(m=>m.MyLabel) を呼び出すと、モデルの実際のインスタンスが BaseModel であるか RequiredModel であるかに応じて、正しい属性が取得されます。

それが理論です。

実際、@Html.TextBox(“MyLabel”) などの「古い」HTML ヘルパーを使用すると、うまく機能します。これらは ModelMetadata.FromStringExpression(field) を呼び出します。具体的なモデル インスタンスが RequiredModel の場合、RequiredModel からメタデータを正しく取得します。新しいヘルパー メソッドは ModelMetadata.FromLambdaExpression(expression) を呼び出しますが、これは正しい具象インスタンスからメタデータを正しく取得しません。

これは MVC のバグですか? 意図的な行動?この問題に対処するための回避策またはより良い方法はありますか?

これはもちろん些細な例です。私たちが扱っている実際のコードには、いくつかの複雑なビジネス ルールと相互作用を持つ約 20 のフィールドがあり、フィールドが必要な場合を除いて、両方のページで同じです。

4

1 に答える 1

0

それが理論です。

いいえ、それは理論ではありません。少なくとも私のものではありません。

私の理論は、ビューの要件が異なるため、ビューごとに個別のビュー モデルを使用することです。したがって、次のようになります。

public class UpdateViewModel
{
    [Display(Name = "My Label")]
    public string MyLabel { get; set ;}
}

と:

public class CreateViewModel
{
    [Display(Name = "My Label")]
    [Required]
    public string MyLabel { get; set ;}
}

個人的にはそうします。ビューの要件は頻繁に変化し、完全に制御したいので、ビューモデルの設計に DRY を完全に犠牲にします。

明らかに実際には、宣言型の DataAnnotations 属性を使用して検証を行うことさえ気にしません。彼らは私を制限します。私はFluentValidation.NETを使用しています。これは、あなたのような問題に非常にエレガントな方法で対処します (同じビュー モデルに対して 2 つの異なるバリデーターを定義するだけです。私の理論に違反し、同じビュー モデルを異なるビューで使用する場合に備えて)。

今すぐ私の答えに反対票を投じてください。私はちょうど2¢を与えました。

于 2011-07-18T19:27:29.960 に答える