Nano Hash - криптовалюты, майнинг, программирование

Как проверить наличие 1 из 2 полей в ASP.NET Core Web API?

Я использую ASP.NET Core 5, .NET 5 версии 5.0.100-rc.1.20452.10. У меня есть модель, которую нужно проверить

/// <summary>
/// Model của form dùng khi admin thêm mới người dùng từ giao diện quản trị.
/// </summary>
public class AddUserForm
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }        
        
    public string About { get; set; }

    public string Fullname { get; set; }
    public string AliasName { get; set; }
    public string SecondMobile { get; set; }
    public string PhoneNumber { get; set; }

    [DataType(DataType.Upload)]
    public IFormFile file { get; set; }
}

Правило проверки должно иметь (обязательно) 1 из 2 полей: About или AliasName . Это означает

  1. Есть About, нет AliasName, все в порядке.

  2. Нет About, есть AliasName, все нормально.

  3. Есть About, есть AliasName, все нормально.

  4. Нет About, нет AliasName, это не нормально.

контроллер

/// <summary>
/// Admin Thêm mới người dùng từ giao diện quản trị.
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult<string>> AddUser([FromForm] AddUserForm form)
{
    if (ModelState.IsValid)
    {
        ApplicationUser user = new ApplicationUser();
        // https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.usermanager-1.createasync?view=aspnetcore-3.1
        // user.PasswordHash = HashPassword()
        if (String.IsNullOrEmpty(form.Email))
        {
            user.Email = form.Email;
        }
        user.EmailConfirmed = true;

        if (String.IsNullOrEmpty(form.Email))
        {
            user.NormalizedEmail = form.Email.ToUpper();
        }
        if (String.IsNullOrEmpty(form.About))
        {
            user.About = form.About;
        }
        if (String.IsNullOrEmpty(form.AliasName))
        {
            user.AliasName = form.AliasName;
        }
        if (String.IsNullOrEmpty(form.Fullname))
        {
            user.Fullname = form.Fullname;
        }
        if (String.IsNullOrEmpty(form.PhoneNumber))
        {
            user.PhoneNumber = form.PhoneNumber;
        }
        if (String.IsNullOrEmpty(form.SecondMobile))
        {
            user.SecondMobile = form.SecondMobile;
        }
        if (String.IsNullOrEmpty(form.Email))
        {
            user.UserName = form.Email;
        }
        //FIXME: Chưa có phần thêm avatar.
        if (form.file != null)
        {
            // Ghi file. Làm tương tự khi thêm Asset.
            if (IsImageFile(form.file))
            {
                string imgPath = await WriteFile(form.file);
                user.Avatar = imgPath;
            }
            else
            {
                return BadRequest(new { message = "Invalid file extension" });
            }
        }
        string pass = form.Password;
        user.Created = DateTime.Now;
        user.Modified = DateTime.Now;
        await _userManger.CreateAsync(user, pass);
        await _db.SaveChangesAsync();
        return Ok(user);
    }
    else
    {
        return BadRequest(ModelState);
    }            
}

Как достичь этого правила проверки, я предпочитаю использовать аннотацию.


  • Вам нужно будет написать собственный атрибут проверки - это должно помочь вам начать stackoverflow.com/a/41901736/426894 18.09.2020

Ответы:


1

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

public class AddUserForm
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        public string Password { get; set; }

        public string About { get; set; }

        public string Fullname { get; set; }

        [RequiredIfHasValue("About", ErrorMessage ="About or AliasName is Required")]
        public string AliasName { get; set; }
        public string SecondMobile { get; set; }
        public string PhoneNumber { get; set; }
    }

    public class RequiredIfHasValueAttribute : ValidationAttribute
    {
        private readonly string _comparisonProperty;

        public RequiredIfHasValueAttribute(string comparisonProperty)
        {
            _comparisonProperty = comparisonProperty;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            ErrorMessage = ErrorMessageString;

            //get entered alias name
            var aliasName = (string)value;
            var property = validationContext.ObjectType.GetProperty(_comparisonProperty);
            if (property == null)
                throw new ArgumentException("Property with this name not found");
            //get the about value
            var aboutValue = (string)property.GetValue(validationContext.ObjectInstance);

            if (aliasName == null && aboutValue == null)
                return new ValidationResult(ErrorMessage);
             
            return ValidationResult.Success;
        }
    }
 
18.09.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..