Asp.net mvc 3 无法显示带有自定义验证属性的ErrorMessageResourceName
基于此,我使用asp.net mvc3和jquery validate创建了一个自定义验证属性: 我已经将其更新为使用一组字符串属性,而不是bool。这很好用。但我的问题是,当我将其与自定义错误消息一起使用时,不会显示自定义消息。我不知道为什么Asp.net mvc 3 无法显示带有自定义验证属性的ErrorMessageResourceName,asp.net-mvc-3,validation,data-annotations,Asp.net Mvc 3,Validation,Data Annotations,基于此,我使用asp.net mvc3和jquery validate创建了一个自定义验证属性: 我已经将其更新为使用一组字符串属性,而不是bool。这很好用。但我的问题是,当我将其与自定义错误消息一起使用时,不会显示自定义消息。我不知道为什么 [RequiredOneFromGroup("PhoneGroup", ErrorMessageResourceName = "PhoneGroup", ErrorMessageResourceType = typeof(Wizard
[RequiredOneFromGroup("PhoneGroup",
ErrorMessageResourceName = "PhoneGroup",
ErrorMessageResourceType = typeof(WizardStrings))]
public String Mobile { get; set; }
[RequiredOneFromGroup("PhoneGroup",
ErrorMessageResourceName = "PhoneGroup",
ErrorMessageResourceType = typeof(WizardStrings))]
public String Phone { get; set; }
以下是自定义验证属性:
[AttributeUsage(AttributeTargets.Property)]
public class RequiredOneFromGroup : ValidationAttribute, IClientValidatable
{
public RequiredOneFromGroup(string groupName)
{
ErrorMessage = string.Format("You must select at least one value from group \"{0}\"", groupName);
GroupName = groupName;
}
public string GroupName { get; private set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
foreach (var property in GetGroupProperties(validationContext.ObjectType))
{
var propertyValue = (string)property.GetValue(validationContext.ObjectInstance, null);
if ( ! string.IsNullOrWhiteSpace(propertyValue))
{
// at least one property is true in this group => the model is valid
return null;
}
}
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
private IEnumerable<PropertyInfo> GetGroupProperties(Type type)
{
return
from property in type.GetProperties()
where property.PropertyType == typeof(string)
let attributes = property.GetCustomAttributes(typeof(RequiredOneFromGroup), false).OfType<RequiredOneFromGroup>()
where attributes.Count() > 0
from attribute in attributes
where attribute.GroupName == GroupName
select property;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var groupProperties = GetGroupProperties(metadata.ContainerType).Select(p => p.Name);
var rule = new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage
};
rule.ValidationType = string.Format("group", GroupName.ToLower());
rule.ValidationParameters["propertynames"] = string.Join(",", groupProperties);
yield return rule;
}
}
我已尝试删除ErrorMessage的手动设置,但随后会得到一条空的错误消息。如何检索在模型的命名参数中指定的ErrorMessageResourceName的值?如何设置它以使自定义验证属性显示它?在GetClientValidationRules方法中替换:
var rule = new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage
};
与:
也要去掉这个.ErrorMessage=。。。在构造函数中输入一行。不能同时设置ErrorMessage和使用验证属性的ErrorMessageResourceName和ErrorMessageResourceType属性。这些是相互排斥的。在GetClientValidationRules方法中,替换:
var rule = new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage
};
与:
也要去掉这个.ErrorMessage=。。。在构造函数中输入一行。不能同时设置ErrorMessage和使用验证属性的ErrorMessageResourceName和ErrorMessageResourceType属性。这些事情是相互排斥的。好吧,我在想,由于自定义验证属性继承自ValidationAttribute,因此错误消息处理将自然完成。但情况似乎并非如此 我围绕这个问题做了如下工作:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var groupProperties = GetGroupProperties(metadata.ContainerType).Select(p => p.Name);
var rule = new ModelClientValidationRule
{
// Replaced ErrorMessage with ErrorMessageString which
// will hold string value of ErrorMessageResourceName if there is
ErrorMessage = this.ErrorMessageString
};
rule.ValidationType = string.Format("group", GroupName.ToLower());
rule.ValidationParameters["propertynames"] = string.Join(",", groupProperties);
yield return rule;
}
好吧,我在想,由于自定义验证属性继承自ValidationAttribute,因此ErrorMessage处理将自然完成。但情况似乎并非如此 我围绕这个问题做了如下工作:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var groupProperties = GetGroupProperties(metadata.ContainerType).Select(p => p.Name);
var rule = new ModelClientValidationRule
{
// Replaced ErrorMessage with ErrorMessageString which
// will hold string value of ErrorMessageResourceName if there is
ErrorMessage = this.ErrorMessageString
};
rule.ValidationType = string.Format("group", GroupName.ToLower());
rule.ValidationParameters["propertynames"] = string.Join(",", groupProperties);
yield return rule;
}
工作完美谢谢你的回答!而且我取消了对this.ErrorMessage.Works的呼叫,非常感谢您的回答!而且我删除了对这个.ErrorMessage的调用。