RegularExpressionAttribute
MVC3 アプリケーションのカスタムを作成します。カスタマイズの目的は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; }
問題は、アプリケーションにローカリゼーションを実装していて、コンストラクターがCustomRegularExpressionAttribute
1 回しか呼び出していないことです。たとえば、アプリケーションのカルチャが英語で開始され、アプリケーションのカルチャがスペイン語に変更された場合、のメッセージCustomRegularExpressionAttribute
は引き続き英語で表示されます。これは、のコンストラクターがCustomRegularExpressionAttribute
1 回だけ呼び出しており、英語のメッセージに対して呼び出されているためです。
なぜ問題なのか誰にもわかりますか?CustomRegularExpressionAttribute
のコンストラクターがすべてのリクエストに対して呼び出されないのはなぜですか??