Asp.net mvc 使用asp.net mvc使特定枚举值的验证失败
是否存在验证某个枚举值的枚举验证属性 或者我应该手动执行此操作:Asp.net mvc 使用asp.net mvc使特定枚举值的验证失败,asp.net-mvc,asp.net-mvc-5.2,Asp.net Mvc,Asp.net Mvc 5.2,是否存在验证某个枚举值的枚举验证属性 或者我应该手动执行此操作: if(viewModel.State == State.None) base.AddModelError("","wrong enum selected..."); 您将如何做到这一点?我将创建自己的验证属性,例如(未测试): 用法: public class TestModel { [EnumValue(SomeEnum.Right)] public SomeEnum Value { get; set; } }
if(viewModel.State == State.None) base.AddModelError("","wrong enum selected...");
您将如何做到这一点?我将创建自己的验证属性,例如(未测试): 用法:
public class TestModel
{
[EnumValue(SomeEnum.Right)]
public SomeEnum Value { get; set; }
}
已更新
所以这是一个通用的代码,我没有测试过这段代码,但它可以编译。请注意,我已经为枚举指定了数值
public enum SomeEnum
{
Right = 1,
Wrong = 2,
Other = 3
}
[AttributeUsage(AttributeTargets.Property)]
public sealed class DisallowEnumValueAttribute : ValidationAttribute
{
public object DissallowedEnum { get; private set; }
public Type EnumType { get; private set; }
public DisallowEnumValueAttribute(Type enumType, object dissallowedEnum)
{
if (!enumType.IsEnum)
throw new ArgumentException("Type must be an enum", "enumType");
DissallowedEnum = dissallowedEnum;
EnumType = enumType;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var disallowed = Convert.ChangeType(DissallowedEnum, EnumType);
var enumVal = Convert.ChangeType(value, EnumType);
if (disallowed == null || enumVal == null)
throw new Exception("Something is wrong"); //or return validation result
if (enumVal == disallowed)
{
return new ValidationResult("This value is not allowed");
}
return ValidationResult.Success;
}
}
public class TestModel
{
[DisallowEnumValue(typeof(SomeEnum), SomeEnum.Wrong)]
public SomeEnum Thing { get; set; }
}
枚举:
视图模型:
public class TestModel
{
[Range((int)(SomeEnum.Right), (int)(SomeEnum.Right), ErrorMessage = "Please select an Enum value")]
public SomeEnum Value { get; set; }
}
不需要其他代码。枚举基本上是整数,因此可以使用Range属性来验证它们。我的枚举验证是这样的,在dataannotation验证中起作用
public enum CreatedBySelfOrOthersEnumValues
{
Self,
Others
}
public class CampaignRegisterValidationModel
{
[Required]
public string Name { get; set; }
[Required]
public CreatedBySelfOrOthersEnumValues CreatedForSelfOrOthers { get; set; }
[Required]
public int CountryCode { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
然后验证它
if (ModelState.IsValid)
{
}
这样做有问题吗?您正在寻找属性验证吗?我相信你可以定义你自己的属性,赋予你这种功能没有问题,我只是在这里寻找最佳实践。或者有人已经使用了该属性,或者我在最新的mvc中找不到它;-)为什么在视图中包含一个无效的枚举值(仅与用户合并)?是否将属性
[必需]设置为公共状态?状态{get;set;}
并仅在枚举状态
中包含有效值(如果该枚举正在其他地方使用,则使用视图模型)。或者,您需要一个接受有效(或无效)名称数组的自定义验证属性,比如[RequiredEnum(Exclude=“None”)]public State?状态{get;set;}
是否可以使此属性一般作为公共属性使用?SomeEnum EnumVal{get;private set;}似乎是硬编码的。如果我要创建一个属性,它必须正常工作,否则会浪费时间,那么我宁愿使用我的oneliner…而不是在MVC中-在反序列化模型时,它需要所有字段都是可变的。
public enum CreatedBySelfOrOthersEnumValues
{
Self,
Others
}
public class CampaignRegisterValidationModel
{
[Required]
public string Name { get; set; }
[Required]
public CreatedBySelfOrOthersEnumValues CreatedForSelfOrOthers { get; set; }
[Required]
public int CountryCode { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
if (ModelState.IsValid)
{
}