注文

2011-12-29 8 views
3

私たちは、MVC3プロジェクトの一つで、次のビューモデルを作成しました:注文

[PropertiesMustMatch("Email", "ConfirmEmail", ErrorMessage = "The email address you provided does not match the email address in the confirm email box.")] 
[PropertiesMustMatch("NewPassword", "ConfirmPassword", ErrorMessage = "The new password you provided does not match the confirmation password in the confirm password box.")] 
public class ActivationStep2ViewModel 
{ 
    ..... 

PropertiesMustMatchは、以下のようにコードを、私たちが作成したカスタム属性であります: 1)電子メールとメールの確認及び2)パスワードとパスワードを確認し、両方の間に不一致がある場合に

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public class PropertiesMustMatchAttribute : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "'{0}' and '{1}' do not match."; 
    private readonly object _typeId = new object(); 

    public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty) 
     : base(_defaultErrorMessage) 
    { 
     OriginalProperty = originalProperty; 
     ConfirmProperty = confirmProperty; 
    } 

    public string ConfirmProperty { get; private set; } 
    public string OriginalProperty { get; private set; } 

    public override object TypeId 
    { 
     get 
     { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      OriginalProperty, ConfirmProperty); 
    } 

    public override bool IsValid(object value) 
    {    
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
    } 
} 

しかし、ビュー上で、パスワードの検証メッセージが一番上に表示されています。私たちは、これらのテキストボックスは、パスワードのテキストボックスの前に表示される電子メールのテキストボックスの検証メッセージが一番上に表示されることを希望

enter image description here

:下の画像を参照してください。

注:(VS2010を介して)ローカルビルドのメッセージの順序は、正常に動作します。メッセージの順序は、私たちのDEVとTESTの環境でのみ乱されます。反射鏡を介して展開するDLLを見てみると、これが表示されているものである:(属性の順序が逆転する)

enter image description here

我々はリリースのビルドでこれを修正するために何ができますか? ご協力いただきありがとうございます。

ありがとうございました。

答えて

3

私たちはまだコンパイラがバリデーション属性の設定を混乱させる理由を知りません。

これを修正するには、別の方法を使用する必要がありました。

カスタム検証属性を取り除き、ビューモデルでIValidatableObjectを実装しました。 Validateメソッドでは、メッセージを表示したい順序で検証ロジックを追加しました(下のコード):

public class ActivationStep2ViewModel : IValidatableObject 
{ 
. 
. 
. 
. 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if(Email != ConfirmEmail) 
     { 
      yield return new ValidationResult("The email address you provided does not match the email address in the confirm email box."); 
     } 

     if(NewPassword != ConfirmPassword) 
     { 
      yield return new ValidationResult("The new password you provided does not match the confirmation password in the confirm password box."); 
     } 
    }