Подтверждение пользователя 18 - PullRequest
0 голосов
/ 30 сентября 2018

Я использовал Tahir Naushad Проверка модели ASP.NET Core 2.0 MVC для создания следующего:

На странице регистрации:

   public class FDRegisterModel : PageModel
{

    private readonly SignInManager<FDUser> _signInManager;
    private readonly UserManager<FDUser> _userManager;
    private readonly ILogger<FDRegisterModel> _logger;
    private readonly IEmailService _emailSender;

    public FDRegisterModel(
        UserManager<FDUser> userManager,
        SignInManager<FDUser> signInManager,
        ILogger<FDRegisterModel> logger,
        IEmailService emailSender
        )
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _logger = logger;
        _emailSender = emailSender;
    }

    [BindProperty]
    public InputModel Input { get; set; }

    public string ReturnUrl { get; set; }



    public class InputModel
    {
        ...
        [Required]
        [DataType(DataType.Date)]
        [AgeCheck]
        [Display(Name = "Date of birth:")]
        public DateTime Birthday { get; set; }

    public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        returnUrl = returnUrl ?? Url.Content("~/");
        if (ModelState.IsValid)
        {
            var FDuser = new FDUser { UserName = Input.UserName, Email = Input.Email };
            var result = await _userManager.CreateAsync(FDuser, Input.Password);
            if (result.Succeeded)
            {
                _logger.LogInformation(Input.UserName + "was created.");

                var code = await _userManager.GenerateEmailConfirmationTokenAsync(FDuser);
                var callbackUrl = Url.Page(
                    "/Profile/ConfirmEmail",
                    pageHandler: null,
                    values: new { FDUsername = FDuser.UserName, code = code },
                    protocol: Request.Scheme);

                await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                    $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                await _signInManager.SignInAsync(FDuser, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        // If we got this far, something failed, redisplay form
        return Page();
    }
}

Из модели FDUser:

public DateTime Birthday { get; set; }

Из модели AgeCheck:

public class AgeCheck : ValidationAttribute
{
    //public DateTime Eighteen = DateTime.Now.Date.AddDays(-6570);
    public DateTime Birthday { get; set; }

    private string GetErrorMessage()
    {
        return $"Users of this website must be eighteen years of age.";
    }

    protected override ValidationResult IsValid(
        object value, ValidationContext validationContext)
    {
        var model = validationContext.ObjectInstance as FDUser;

        if (model == null)
            throw new ArgumentException("No birthday given");

        if (model.Birthday > DateTime.Now.Date.AddDays(-6570))
            return new ValidationResult(GetErrorMessage(validationContext));

        return ValidationResult.Success;
    }

    private string GetErrorMessage(ValidationContext validationContext)
    {
        if (!string.IsNullOrEmpty(this.ErrorMessage))
            return this.ErrorMessage;

        return $"Users of this website must be eighteen years of age.";
    }
}

Возвращает null:

Ошибка проверки возраста

Я такжеЯ посмотрел на статью Microsoft , и я хотел бы иметь что-то более простое, как это:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    if (Birthday > Eighteen)
    {
        return new ValidationResult(GetErrorMessage());
    }

    return ValidationResult.Success;
}

Но я не могу заставить это работать.

1 Ответ

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

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

public sealed class AgeCheck : ValidationAttribute
    {
        public DateTime Birthday;
        public DateTime Eighteen = DateTime.Now.Date.AddDays(-6573);

        protected override ValidationResult IsValid(object Birthday, ValidationContext validationContext)
        {
            if (Eighteen <= Convert.ToDateTime(Birthday))
            {
                return new ValidationResult("You must be eighteen to use this website");
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...