gpt4 book ai didi

c# - 如何在 MVC3 的 TemplateEditor 中将验证属性添加到模型属性

转载 作者:行者123 更新时间:2023-11-30 16:28:34 25 4
gpt4 key购买 nike

我有一个 DateTime TemplateEditor,我想为其添加正则表达式验证。我有一个 RegularExpression 属性,我可以用它装饰模型,但我不想用正则表达式装饰我所有模型中的每个日期时间属性。

有什么方法可以让我的自定义 TemplateEditor 在为它呈现文本框时添加适当的不显眼的标签?

最佳答案

您不应在模板中添加验证器,而应使用自定义 ModelMetadataValidatorProvider 插入验证器。首先,创建您的 ModelMetadataProvider 类:

public class MyModelMetadataValidatorProvider : DataAnnotationsModelValidatorProvider
{

internal static DataAnnotationsModelValidationFactory DefaultAttributeFactory = Create;
internal static Dictionary<Type, DataAnnotationsModelValidationFactory> AttributeFactories = new Dictionary<Type, DataAnnotationsModelValidationFactory>() {
{
typeof(RegularExpressionAttribute),
(metadata, context, attribute) => new RegularExpressionAttributeAdapter(metadata, context, (RegularExpressionAttribute)attribute)
}
};

internal static ModelValidator Create(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute)
{
return new DataAnnotationsModelValidator(metadata, context, attribute);
}

protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
List<ModelValidator> vals = base.GetValidators(metadata, context, attributes).ToList();

// inject our new validator
if (metadata.ModelType.Name == "DateTime")
{
DataAnnotationsModelValidationFactory factory;

RegularExpressionAttribute regex = new RegularExpressionAttribute(
"^(((0?[1-9]|1[012])/(0?[1-9]|1\\d|2[0-8])|(0?[13456789]|1[012])/(29|30)|(0?[13578]|1[02])/31)/(19|[2-9]\\d)\\d{2}|0?2/29/((19|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(([2468][048]|[3579][26])00)))$");
regex.ErrorMessage = "Invalid date format";
if (!AttributeFactories.TryGetValue(regex.GetType(), out factory))
factory = DefaultAttributeFactory;

vals.Add(factory(metadata, context, regex));
}

return vals.AsEnumerable();
}
}

接下来,在 Application_StartGlobal.asax.cs 中注册您的 ModelMetadataValidatorProvider。

    ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new MyModelMetadataValidatorProvider());

现在,当您访问模型时,RegularExpressionAttribte 将附加到每个 DateTime 字段。您还可以扩展它以提供本地化的 DateTime 正则表达式和消息。

辅导员

关于c# - 如何在 MVC3 的 TemplateEditor 中将验证属性添加到模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7032340/

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