2011-01-20 11 views
5

私はASP.NET MVC3でこのような継承された属性を作成した:それは働かなかったとMVCはそれを無視しASP.NET MVC 3のRequiredAttributeから継承すると、クライアント側の検証が機能しません。

[RequiredFromResource("Title", "Resources.Resource, MyProject.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")] 
public string Title { get; set; } 

public sealed class RequiredFromResourceAttribute : RequiredAttribute 
{ 
    public RequiredFromResourceAttribute(string errorResourceName, string errorResourceTypeName) 
    { 
     this.ErrorMessageResourceName = errorResourceName; 
     this.ErrorMessageResourceType = Type.GetType(errorResourceTypeName); 
    } 
} 

そして、このようにそれを使用します。次に、次のようにRequiredAttributeから継承したよりシンプルなクラスを作成します。

public class MyRequiredAttribute : RequiredAttribute 
{ 
} 

私はそれを言ったように使用します。しかし、それは再び働かなかった。

これらの方法はすべて「DisplayNameAtrribute」で完全に機能しますが、

何が問題ですか?

+0

私の意見では、marcindの答えはSkipHarrisより優れています。 SkipのRequiredAttributeAdapterは、クライアント側の検証でRequiredFromResourceAttributeの代わりに通常のRequired属性を使用するように見えます。 – Keerigan

答えて

3

あなたはGlobal.asaxの中に次のコードを追加することでこの問題を解決することができます(答えhereを見つけた)

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredLocalizableAttribute), typeof(RequiredAttributeAdapter)); 

また、marcindのソリューションを使用して、ModelClientValidationRequiredRuleのコンストラクタにエラーメッセージが必要であることがわかりました。フィールドの表示名を含む更新バージョンを以下に示します。

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     string msg = FormatErrorMessage(metadata.GetDisplayName()); 
     yield return new ModelClientValidationRequiredRule(msg); 
    } 
+0

@ marcindの答えは、これをもっとうまく処理しているようです。 RequiredAttributeAdapterを使用すると、カスタムの代わりに通常のRequired属性が呼び出されます。 – Keerigan

+0

Skipの答えは私のためにうまくいくようです。ありがとうございました。 –

3

継承された属性では機能しないのはクライアント側の検証のみです。その理由は、サーバー側の属性をクライアントの検証動作にマッピングする際に、MVCが厳密な型の同等性を使用するためです。これを回避するには

あなたがIClientValidatableを実装するために、カスタム属性が必要になります。

public class MyRequiredAttribute : IClientValidatable { 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     yield return new ModelClientValidationRequiredRule(); 
    } 
} 
+1

MVC2で同じように動作するのはなぜですか? –

+1

@SkipHarris 'よりこれを処理する方がはるかに良い方法です。 RequiredAttributeAdapterを使用すると、カスタムの代わりに通常のRequired属性が呼び出されます。 – Keerigan

関連する問題