MVC3で予期せぬ動作が発生し、モデルメタデータの取得方法と関連があります。モデルメタデータを取得するHtmlHelperメソッドの動作が一貫しない
私は以前、システムの2つの異なる領域で収集されたいくつかのデータに対して、同じEditorTemplateを使用することについて私の開発者の一人と話しました。データフィールドは[必須]属性を除いてほぼ同じです。あるページでは特定のフィールドが必要ですが、他のページでは必要ではありません。理論的には、これは、各フィールドに共通の属性を持ち、それらのモデルを継承し、プロパティをオーバーライドし、追加の検証属性を追加するベースモデルを使用することで実現できます。たとえば、次のように
class BaseModel
{
[Display(Name=”My Label”)]
public virtual string MyLabel { get; set ;}
}
class RequiredModel : BaseModel
{
[Required]
public override string MyLabel { get; set ;}
}
は、次にViewが強くBaseModelに型付けされ、ビューで実際のかどうかに応じて、正しい属性を拾う必要があります(M => m.MyLabel)@ Html.EditorForに呼び出すことができますモデルのインスタンスはBaseModelまたはRequiredModelです。
それは理論です。
実際、「古い」HTMLヘルパーを使用すると効果的です。 @ Html.TextBox( "MyLabel")。それらはModelMetadata.FromStringExpression(field)を呼び出します。具体的なモデルインスタンスがRequiredModelの場合、RequiredModelからメタデータを正しく取得します。より新しいヘルパーメソッドは、ModelMetadata.FromLambdaExpression(expression)を呼び出します。これは、正しい具体的なインスタンスからメタデータを正しく取得しません。
これはMVCのバグですか?意図的な行動?回避策、またはこの問題に対処するためのより良い方法はありますか?
これは当然のことですが、実際のコードでは、複雑なビジネスルールとインタラクションを持つ約20のフィールドがあります。どちらのフィールドでも必要なフィールドを除き、両方のページで同じです。
ダーリン、マイクロソフトでは、アプリケーションの複数の領域で単一のビューを使用できるエディタテンプレートを提供しています。エディタテンプレートが複数のフィールドを含むモデル用である場合、検証属性を一貫して適用していないだけです。 もっと大きな問題は、@ Html.Editor( "MyLabel")はそれを一方的に行い、@ Html.EditorFor(m => m.MyLabel)は逆のことです。 –
@マークシャピロ、私はマイクロソフトが私たちに与えたものをよくよく知っています。 –