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





Вы можете добавить в свою модель функцию 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.")
в контроллере говорится, что модель не существует в текущем контексте, мне нужно импортировать некоторую библиотеку?
Вам нужно использовать любое имя объекта вашей модели, отправленное обратно в контроллер. Я обновил свой пример, чтобы включить действие контроллера.
ваш код работает отлично, но сообщение об ошибке не отображается
Вы можете использовать объект-заполнитель для проверки в своем представлении или использовать сообщение ValidationSummary. Я обновлю свой ответ.
Пока вы делаете это мог, я бы посоветовал вам пойти по пути, который использует подход встроенной структуры для проверки состояния модели, такой как предложено выше. Более «стандартный» подход может быть лучше при интеграции с другими компонентами (например, с сообщениями об ошибках в пользовательском интерфейсе).
Один из подходов: вы можете реализовать свой собственный атрибут проверки, как показано ниже -
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 с настраиваемым сообщением об ошибке.
Если у вас есть собственные правила, подобные приведенным выше, я бы посоветовал вам вместо этого перейти на
FluentValidation.. См .: fluentvalidation.net