У меня есть эти две радиокнопки для подписки. Если клиент выбирает переключатель «Да», я показываю текстовое поле ввода адреса электронной почты. Если клиент выбирает «да», текстовое поле адреса электронной почты является обязательным. Как добавить условную проверку внутри модели?
Модель:
public class CustomerModel
{
[Required]
public bool Subscribe {get; set;}
[RequiredIfYes]
public string Email {ger; set;}
}
Пользовательский класс проверки:
public class RequiredIfYesAttribute : Attribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == "Yes")
{
return ValidationResult.Success;
}
else
{
return new ValidationResult("Email is Required.");
}
}
}
Вид :
<div class = "form-group col-md-12 ">
<label class = "required" for = "subscribe">Email Subsciption</label>
<span >Yes : <input type = "radio" value = "Yes" name = "Subscribe" id = "chkYes" onclick = "ShowHideDiv()" /></span>
<span >No : <input type = "radio" value = "No" name = "Subscribe" id = "chkNo" onclick = "ShowHideDiv()" /></span>
@Html.ValidationMessageFor(model => model.Subscribe)
</div>
<div id = "dvtext" style = "display: none">
<label for = "email" class = "required">Enter Email</label>
<div style = "width:300px;">
@Html.TextBoxFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
</div>




Попробуйте этот код для пользовательской проверки:
public class RequiredIfYesAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var radioName = validationContext.ObjectInstance.GetType().GetProperty("Subscribe");
string radioValue = radioName.GetValue(validationContext.ObjectInstance, null)?.ToString();
var emailName = validationContext.ObjectInstance.GetType().GetProperty("Email");
string emailValue = emailName.GetValue(validationContext.ObjectInstance, null)?.ToString();
if (radioValue == "Yes" && string.IsNullOrEmpty(emailValue))
{
return new ValidationResult("Email is Required.");
}
else
{
return ValidationResult.Success;
}
}
}
когда я выбираю переключатель «Нет», текст электронной почты будет нулевым. Но это дает мне ошибку в emailValue «System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта».
Ответ обновлен. Нулевой условный оператор? был добавлен перед двумя ToString()s.
Вы можете посмотреть в Надежная проверка, это GitHub-проект