2011-07-18 9 views
1

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のフィールドがあります。どちらのフィールドでも必要なフィールドを除き、両方のページで同じです。

答えて

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つの異なるバリデータを定義することによって解決します。私の理論に違反し、異なるビューで同じビューモデルを使用することになります。

今すぐ私の答えをdownvoteしてください。私はちょうど2¢を与えました。

+0

ダーリン、マイクロソフトでは、アプリケーションの複数の領域で単一のビューを使用できるエディタテンプレートを提供しています。エディタテンプレートが複数のフィールドを含むモデル用である場合、検証属性を一貫して適用していないだけです。 もっと大きな問題は、@ Html.Editor( "MyLabel")はそれを一方的に行い、@ Html.EditorFor(m => m.MyLabel)は逆のことです。 –

+1

@マークシャピロ、私はマイクロソフトが私たちに与えたものをよくよく知っています。 –

関連する問題