モデルのメタデータを取得する方法に関係する、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 のフィールドがあり、フィールドが必要な場合を除いて、両方のページで同じです。