File: Pages\CustomModelTypeModel.cshtml.cs
Web Access
Project: src\src\Mvc\test\WebSites\RazorPagesWebSite\RazorPagesWebSite.csproj (RazorPagesWebSite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.RazorPages;
 
namespace RazorPagesWebSite;
 
public class CustomModelTypeModel : PageModel
{
    [BindProperty]
    public InputModel Input { get; set; }
 
    public string ReturnUrl { get; set; }
 
    [BindRequired]
    [FromQuery(Name = nameof(Attempts))]
    public int Attempts { get; set; }
 
    public class InputModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }
 
        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }
 
        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }
 
    public virtual void OnGet(string returnUrl = null)
    {
        throw new NotImplementedException();
    }
 
    public virtual IActionResult OnPostAsync(string returnUrl = null)
    {
        throw new NotImplementedException();
    }
}
 
public class User
{
}
 
internal class CustomModelTypeModel<TUser> : CustomModelTypeModel where TUser : User
{
    private readonly ILogger<CustomModelTypeModel<TUser>> _logger;
 
    public CustomModelTypeModel(ILogger<CustomModelTypeModel<TUser>> logger)
    {
        _logger = logger;
    }
 
    public override void OnGet(string returnUrl = null)
    {
        // We only care about being able to resolve the service from DI.
        // The line below is just to make the compiler happy.
        _logger.LogInformation(typeof(TUser).Name);
        ViewData["UserType"] = typeof(TUser).Name;
        ReturnUrl = returnUrl;
    }
 
    public override IActionResult OnPostAsync(string returnUrl = null)
    {
        if (!ModelState.IsValid)
        {
            Attempts++;
            RouteData.Values.Add(nameof(Attempts), Attempts);
 
            return Page();
        }
 
        return Redirect("~/");
    }
}