/ / Zmeniť validáciu vlastnosti v ASP.NET MVC 3 podľa podmienky - asp.net-mvc, asp.net-mvc-3, validácia, validačný atribút

Zmena validácie pre vlastníctvo v ASP.NET MVC 3 podľa stavu - asp.net-mvc, asp.net-mvc-3, validácia, validáciaattribucia

Toto je môj model:

[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")]
public string Phone { get; set; }

[ForeignKey]
public long PhoneType { get; set; } // 1-CellPhone , 2-Phone

Takže myslím, že zmeniť RegularExpression Validácia zmenou PhoneType ak chcem povedať konkrétnejšie:

ak užívateľ vyberie CellPhone z DropDownList validácia bude

[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")]

a ak vyber Phone validácia bude

 [RegularExpression("^[1-9][0-9]{9}$", ErrorMessage = "Invalid Number!")]

Aký je váš návrh?

odpovede:

6 pre odpoveď č. 1

Môžete napísať vlastný atribút overenia:

public class PhoneAttribute : ValidationAttribute
{
private readonly string _phoneTypeProperty;
public PhoneAttribute(string phoneTyperoperty)
{
_phoneTypeProperty = phoneTyperoperty;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var property = validationContext.ObjectType.GetProperty(_phoneTypeProperty);
if (property == null)
{
return new ValidationResult(string.Format("Unknown property: {0}", _phoneTypeProperty));
}

var phone = Convert.ToString(value, CultureInfo.CurrentCulture);
if (string.IsNullOrEmpty(phone))
{
return null;
}

var phoneType = (long)property.GetValue(validationContext.ObjectInstance, null);
Regex regex = null;
if (phoneType == 1)
{
regex = new Regex(@"^08[589][0-9]{8}$");
}
else if (phoneType == 2)
{
regex = new Regex("^[1-9][0-9]{9}$");
}
else
{
return new ValidationResult(string.Format("Unknown phone type: {0}", phoneType));
}

var match = regex.Match(phone);
if (match.Success && match.Index == 0 && match.Length == phone.Length)
{
return null;
}

return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}

a potom ozdobte vlastnosť modelu zobrazenia týmto atribútom:

public class MyViewModel
{
[Phone("PhoneType", ErrorMessage = "Invalid Number!")]
public string Phone { get; set; }

public long PhoneType { get; set; }
}

Ďalšou možnosťou (a ktorú by som viac než dôrazne odporúčal), ak si chcete uľahčiť život validáciou, je použitie FluentValidation.NET. Stačí sa pozrieť na to, aké jednoduchšie je definovaťoverovacie pravidlá namiesto písania riadkov inštalatérskeho kódu a už nedokáže pochopiť, ktorá časť je inštalatérska a ktorá časť je skutočnou validáciou. So serverom FluentValidation.NET neexistujú nijaké inštalatérske práce. Požiadavky na overenie vyjadríte plynule:

public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
public MyViewModelValidator()
{
RuleFor(x => x.Phone)
.Matches(@"^08[589][0-9]{8}$").When(x => x.PhoneType == 1)
.Matches("^[1-9][0-9]{9}$").When(x => x.PhoneType == 2);
}
}

Jednoducho porovnajte tento validátor s predchádzajúcim.