Asp. Сетевая Проверка MVC - зависимые поля

Я в настоящее время пытаюсь работать посредством проверки 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")]

У кого-либо был опыт с этим видом проверки? Просто было бы лучше записать это в контроллер?

Спасибо за помощь.

7
задан DaveRandom 25 February 2013 в 20:47
поделиться

1 ответ

Я бы написал логику валидации в модели, а не в контроллере. Контроллер должен обрабатывать только взаимодействие между представлением и моделью. Так как именно модель требует валидации, Я думаю, что это широко распространенное место логики валидации.

Для валидации, которая зависит от значения другого свойства или поля, я (к сожалению) не вижу, как полностью избежать написания какого-то кода для этого в модели, как показано в книге 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, но это бы справилось только с таким типом логики. Еще более сложные вещи потребовали бы еще один довольно специфический атрибут и т.д., который быстро сходит с ума

.
3
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: