ASP.NET MVC DataAnnotation Обязательно 1 из 3 свойство - PullRequest
0 голосов
/ 09 октября 2018

Я создаю проект с использованием ASP.NET MVC.

Мой класс модели выглядит следующим образом:

public class CaseInformation
{
    public int Id { get; set; }

    public string CaseNumber { get; set; }
    public string RitNumber { get; set; }
    public string ApilNumber { get; set; }

    public DateTime Date { get; set; }

    public double CaseInvolvedRevenue { get; set; }
    public string CaseShortDescription { get; set; }
    public string CaseUpdateStatus { get; set; }

    public CompanyDetails CompanyDetails { get; set; }
    public int CompanyDetailsId { get; set; }
}

Здесь CaseNumber, RitNumber, ApilNumber требуется только 1.Я не могу поставить [Required] на всех них.Как я могу это сделать?Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Один из подходов заключается в том, что вы можете реализовать свой собственный атрибут проверки, как показано ниже -

public class CaseInfoRequiredAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var caseInfo = (CaseInformation) validationContext.ObjectInstance;
        if (string.IsNullOrEmpty(caseInfo.CaseNumber) &&
            string.IsNullOrEmpty(caseInfo.RitNumber) &&
            string.IsNullOrEmpty(caseInfo.ApilNumber))
        {
            return new ValidationResult("Either CaseNumber or RitNumber or ApilNumber is required.");
        }
        return ValidationResult.Success;        
    }
}

Затем использовать пользовательский атрибут для любого поля

public class CaseInformation
{
    public int Id { get; set; }

    [CaseInfoRequired]
    public string CaseNumber { get; set; }
    public string RitNumber { get; set; }
    public string ApilNumber { get; set; }

    public DateTime Date { get; set; }

    public double CaseInvolvedRevenue { get; set; }
    public string CaseShortDescription { get; set; }
    public string CaseUpdateStatus { get; set; }

    public CompanyDetails CompanyDetails { get; set; }
    public int CompanyDetailsId { get; set; }
}
0 голосов
/ 10 октября 2018

Вы можете реализовать интерфейс IValidatableObject в своем классе CaseInformation.Вот как это будет выглядеть:

public class CaseInformation : IValidatableObject
{
    ...

    public IEnumerable<ValidationResult> Validate(ValidationContext ctx)
    {
        if (string.IsNullOrWhiteSpace(CaseNumber) &&
            string.IsNullOrWhiteSpace(RitNumber) &&
            string.IsNullOrWhiteSpace(ApilNumber))
        {
            yield return new ValidationResult("Your error message here.");
        }
    }
}

Метод Validate(ValidationContext) вызывается средой при выполнении проверки модели.Здесь мы просто проверяем, все ли три значения отсутствуют, и если да, мы сообщаем об ошибке, возвращая ValidationResult с пользовательским сообщением об ошибке.

0 голосов
/ 09 октября 2018

Вы можете добавить функцию IsValid () в вашу модель, которая возвращает true / false и добавлять ошибки в ModelState.

CaseInformation:

public class CaseInformation
{
    public int Id { get; set; }

    public string CaseNumber { get; set; }
    public string RitNumber { get; set; }
    public string ApilNumber { get; set; }

    public DateTime Date { get; set; }

    public double CaseInvolvedRevenue { get; set; }
    public string CaseShortDescription { get; set; }
    public string CaseUpdateStatus { get; set; }

    public CompanyDetails CompanyDetails { get; set; }
    public int CompanyDetailsId { get; set; }

    public bool IsValid(out IDictionary<string, string> errors)
    {
        errors = new Dictionary<string, string>();
        if (string.IsNullOrWhiteSpace(CaseNumber) && string.IsNullOrWhiteSpace(RitNumber) &&
            string.IsNullOrWhiteSpace(ApilNumber))
        {
            errors.Add("MyError", "At least one Case, Rit or Apil number is required.");
        }
        return errors.Count == 0;
    }
}

А затем в вашем контроллере:

public ActionResult Index(CaseInformation model)
{
    if (!model.IsValid(out var errors))
    {
        foreach (KeyValuePair<string, string> error in errors)
        {
            ModelState.AddModelError(error.Key, error.Value);
        }                
    }
    if (ModelState.IsValid)
    {
        // it worked
    }
    else
    {
        // must be errors
    }
    return View();
}

А потом по вашему мнению:

@Html.ValidationSummary(false, "Please fix the below and try again.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...