2011-08-05 9 views
2

私は、AssociatedMetaDataProviderを拡張したカスタムメタデータプロバイダを実装しました。クラスの最初の目的は、プロパティ名を取り、それをパスカルのケースに入れた単語に変換することでした。検証メッセージのカスタムメタデータ

サイトのすべての必須フィールドのラベルに視覚的なインジケータ( '*'文字)を追加するという新しい要件があります。私は、カスタムメタデータプロバイダに次のコードを追加することで、この変更を行うことができます。

 PropertyInfo property = containerType.GetProperty(propertyName); 
     if (property.GetCustomAttributes(typeof(RequiredAttribute), true).Any()) 
      metadata.DisplayName = "* " + metadata.DisplayName; 

このコードは、それがすべてのラベルに「*」の文字が追加され、その中で「働きます」。ただし、すべての検証メッセージ(たとえば、Html.ValidationMessageFor(x => x.FirstName)で使用されているもの)に '*'文字を追加するという副作用があります。この場合、ラベルを '* First Name'にして、エラーメッセージを'*ファーストネームフィールドは必須です'と表示されます。

ラベルのメタデータの一部として '*'文字を追加する方法はありますか?検証メッセージに使用されるプロパティ名、または検証メッセージの作成時にカスタムメタデータを提供する方法はありますか?

答えて

1

問題について考えていくつかのより多くの時間を過ごした後、私は仕事に思える何かを思い付くことができました。私は本当にしかし、解決策を愛していない:

 foreach (ValidationAttribute validationAttribute in attributes.Where(x => x is ValidationAttribute)) 
     { 
      if (String.IsNullOrEmpty(validationAttribute.ErrorMessage)) 
      { 
       validationAttribute.ErrorMessage = validationAttribute.FormatErrorMessage(formattedPropertyName); 
      } 
     } 

このコードは(カスタムメタデータプロバイダ内CreateMetadata方法の一部として)問題のコードと同時に実行されます。これは私がテストしたすべてのケースで機能しますが、検証プロバイダに実際にメタデータを提供するわけではありません。パスカルを使用してプロパティ名を使用してエラー文字列をフォーマットするだけです。これは、通常の検証メッセージのほとんどがセットアップされている方法で機能します。検証属性にエラーメッセージを明示的に設定しているという事実は正しくないようです。

しかし、これはグローバルな解決策として機能することはわかりません。このソリューションは「機能する」ものですが、より良いソリューションが利用できることを願っています。

+0

私はもともとそれを追加したときと同じように、私はこの回答で同じ予約をしています。しかし、私はより良い解決策を見つけることができませんでしたが、より良い解決策が追加されるまで、それを受け入れられた答えとしてマークしています。 – ajalexander

0

私は現時点では自分の電話機にあるので、リフレクタまたはIDEの利点はありませんしかし、バリデータを変更せずにこれを行うことはできないと思います。エラーメッセージの書式文字列を使用して、ここで変更したのと同じ表示名を渡します。私は間違っているかもしれません(私はあなたのアプローチが好きです)。

しかし、カスタムエディタテンプレートを作成することで、あなたはやったことができました。これは、HTMLのコントロールをWeb開発者の手に渡します。メタデータのアプローチを使用すると、アスタリスク、たとえば、自分のクラスを着色の目的で与えることはできません。

ひらめきを使用する場合、レイアウトテンプレートを使用すると、すべてのフィールドタイプで標準のラベル/入力方法を使用できるようになります。

Html.LabelForを使用し、現在のモデルが必要な場合はオプションのブロックを使用していますが、私は思うほど多くの柔軟性を提供しており、検証メッセージを妨げないのでメタデータソリューションよりも好きです。

私が言うように、私の最初の疑問に、しかし、私は間違っている可能性:)

関連する問題