Я в настоящее время пытаюсь работать посредством проверки MVC и наталкиваюсь на некоторые проблемы, где поле требуется в зависимости от значения другого поля. Пример ниже (что я еще не выяснил) - Если PaymentMethod == "Чек", то ChequeName должен требоваться, иначе он может быть пропущен.
[Required(ErrorMessage = "Payment Method must be selected")]
public override string PaymentMethod
{ get; set; }
[Required(ErrorMessage = "ChequeName is required")]
public override string ChequeName
{ get; set; }
Я использую Систему. ComponentModel. DataAnnotations для [Необходимого], и также расширили ValidationAttribute, чтобы попытаться получить эту работу, но я не могу передать переменную до, делают проверку (расширение ниже)
public class JEPaymentDetailRequired : ValidationAttribute
{
public string PaymentSelected { get; set; }
public string PaymentType { get; set; }
public override bool IsValid(object value)
{
if (PaymentSelected != PaymentType)
return true;
var stringDetail = (string) value;
if (stringDetail.Length == 0)
return false;
return true;
}
}
Реализация:
[JEPaymentDetailRequired(PaymentSelected = PaymentMethod, PaymentType = "Cheque", ErrorMessage = "Cheque name must be completed when payment type of cheque")]
У кого-либо был опыт с этим видом проверки? Просто было бы лучше записать это в контроллер?
Спасибо за помощь.
Я бы написал логику валидации в модели, а не в контроллере. Контроллер должен обрабатывать только взаимодействие между представлением и моделью. Так как именно модель требует валидации, Я думаю, что это широко распространенное место логики валидации.
Для валидации, которая зависит от значения другого свойства или поля, я (к сожалению) не вижу, как полностью избежать написания какого-то кода для этого в модели, как показано в книге Wrox ASP.NET MVC, что-то вроде:
public bool IsValid
{
get
{
SetRuleViolations();
return (RuleViolations.Count == 0);
}
}
public void SetRuleViolations()
{
if (this.PaymentMethod == "Cheque" && String.IsNullOrEmpty(this.ChequeName))
{
RuleViolations.Add("Cheque name is required", "ChequeName");
}
}
Делать все валидации декларативно было бы здорово. Я уверен, что можно было бы сделать RequiredDependentAttribute
, но это бы справилось только с таким типом логики. Еще более сложные вещи потребовали бы еще один довольно специфический атрибут и т.д., который быстро сходит с ума