ASP.NET MVC DataAnnotation Требуется свойство 1 из 3

Я создаю проект с использованием 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]. Как я могу это сделать? Пожалуйста помоги.

Если у вас есть собственные правила, подобные приведенным выше, я бы посоветовал вам вместо этого перейти на FluentValidation .. См .: fluentvalidation.net

Ankit Vijay 09.10.2018 22:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Информация о кейсе:

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.")

в контроллере говорится, что модель не существует в текущем контексте, мне нужно импортировать некоторую библиотеку?

MD MASUM 09.10.2018 22:53

Вам нужно использовать любое имя объекта вашей модели, отправленное обратно в контроллер. Я обновил свой пример, чтобы включить действие контроллера.

mr.coffee 09.10.2018 22:55

ваш код работает отлично, но сообщение об ошибке не отображается

MD MASUM 09.10.2018 23:11

Вы можете использовать объект-заполнитель для проверки в своем представлении или использовать сообщение ValidationSummary. Я обновлю свой ответ.

mr.coffee 09.10.2018 23:19

Пока вы делаете это мог, я бы посоветовал вам пойти по пути, который использует подход встроенной структуры для проверки состояния модели, такой как предложено выше. Более «стандартный» подход может быть лучше при интеграции с другими компонентами (например, с сообщениями об ошибках в пользовательском интерфейсе).

Reddog 10.10.2018 00:47

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

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; }
}
Ответ принят как подходящий

Вы можете реализовать интерфейс 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 с настраиваемым сообщением об ошибке.

Другие вопросы по теме