3

RegularExpressionAttributeMVC3 アプリケーションのカスタムを作成します。カスタマイズの目的はRegularExpressionAttribute、リソース ファイル メッセージ内のトークンをキーワードに置き換えることです。例: 「フィールド __ に無効な文字が含まれています」。

したがって、_トークンをAddressキーワードに置き換えます。

ResourceManager(_resourceManagerType.FullName, 
System.Reflection.Assembly.Load(AssemblyNames.TRUETRAC_RESOURCES)).GetString(_errorMessageResourceName).Replace("_","Address");

カスタム属性の は次のとおりです。

public class CustomRegularExpressionAttribute : RegularExpressionAttribute
{
    string _errorMessageResourceName;
    Type _resourceManagerType;

    public CustomRegularExpressionAttribute(string _pattern, string fieldName, string errorMessageResourceName, Type resourceManagerType)
        : base(_pattern)
    {
        _errorMessageResourceName = errorMessageResourceName;
        _resourceManagerType = resourceManagerType;

        this.ErrorMessage = FormatErrorMessage(fieldName);
    }
    public override string FormatErrorMessage(string fieldName)
    {
        return //Resources.en_MessageResource.ResourceManager.GetString(fieldName);
        new ResourceManager(_resourceManagerType.FullName, System.Reflection.Assembly.Load(AssemblyNames.TRUETRAC_RESOURCES)).GetString(_errorMessageResourceName).Replace("__", fieldName);    
    }
}

public class CustomRegularExpressionValidator : DataAnnotationsModelValidator<CustomRegularExpressionAttribute>
{
    private readonly string _message;
    private readonly string _pattern;

    public CustomRegularExpressionValidator(ModelMetadata metadata, ControllerContext context, CustomRegularExpressionAttribute attribute)
        : base(metadata, context, attribute)
    {
        _pattern = attribute.Pattern;
        _message = attribute.ErrorMessage;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = _message,
            ValidationType = "regex"
        };

        rule.ValidationParameters.Add("pattern", _pattern);

        return new[] { rule };
    }
}

次に、この属性を Global.aspx Application_Start イベントに登録します。

void Application_Start(object sender, EventArgs e)
    {

        AreaRegistration.RegisterAllAreas();

        // Register CustomRegularExpressionValidator
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomRegularExpressionAttribute), typeof(CustomRegularExpressionValidator));

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

そして、次のようなモデル プロパティに適用されます。

[CustomRegularExpression(RegularExpression.Alphanumeric, "Address", "CV_Address", typeof(Resources.en_MessageResource))]
    public string Address { get; set; }

問題は、アプリケーションにローカリゼーションを実装していて、コンストラクターがCustomRegularExpressionAttribute1 回しか呼び出していないことです。たとえば、アプリケーションのカルチャが英語で開始され、アプリケーションのカルチャがスペイン語に変更された場合、のメッセージCustomRegularExpressionAttributeは引き続き英語で表示されます。これは、のコンストラクターがCustomRegularExpressionAttribute1 回だけ呼び出しており、英語のメッセージに対して呼び出されているためです。

なぜ問題なのか誰にもわかりますか?CustomRegularExpressionAttributeのコンストラクターがすべてのリクエストに対して呼び出されないのはなぜですか??

4

2 に答える 2

0

カスタム検証属性のコンストラクターで ErrorMessage プロパティを初期化するときに、同じ問題に遭遇しました。

私の解決策は、メソッドをオーバーライドするIsValidことです。ここに電話するだけbase.IsValidです。このメソッドは、有効な場合は null を返し、それ以外の場合はValidationResult、プロパティを設定できる場所を返しErrorMessageます。

    public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{    
            public RequiredAttribute()
            {
            }

            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
                    {
                        string displayName = validationContext.DisplayName;
                        ValidationResult result = base.IsValid(value, validationContext);
                        if (result != null)
                            result.ErrorMessage = string.Format(GetTranslatation("RequiredField"), displayName);
                        return result;
                    }
            }
    }

IsValidは検証中に常に実行されるため、常に現在の言語でメッセージが返されます。

于 2016-03-03T14:46:46.807 に答える
0

このメソッドは、アプリケーションの開始時Application_Startに1 回だけ呼び出されます。さらに、属性はコンパイルされるため、実行時に (リフレクションまたはメタデータを介して) 読み取ることはできますが、変更することはできません。

于 2012-08-27T16:25:04.670 に答える