gpt4 book ai didi

c# - 在自定义 RegularExpressionAttribute 中,构造函数不会在第一次调用后调用

转载 作者:太空宇宙 更新时间:2023-11-03 16:27:22 26 4
gpt4 key购买 nike

我们为 MVC3 应用程序编写自定义 RegularExpressionAttribute。自定义 RegularExpressionAttribute 的目的是,我们想用关键字替换资源文件消息中的 token 。例如。 “字段 __ 有一些无效字符”。

所以我们想用 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 的构造函数仅调用一次。就像如果应用程序的初始文化是英语然后我们将应用程序的文化更改为西类牙语,但是 CustomRegularExpressionAttribute 的消息仍然以英语显示,因为 CustomRegularExpressionAttribute 的构造函数正在调用只调用过一次,一直调用英文消息。

任何人都可以说出问题的原因吗?为什么 CustomRegularExpressionAttribute 的构造函数没有为每个请求调用??

最佳答案

Application_Start 方法仅在应用程序开始 时被调用一次。此外,属性会被编译,因此它们可以在运行时读取(通过反射或元数据),但不能更改。

关于c# - 在自定义 RegularExpressionAttribute 中,构造函数不会在第一次调用后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com