【问题标题】:Compare Attribute fails on Post比较属性在发布时失败
【发布时间】:2020-10-18 11:54:53
【问题描述】:

我有一个注册表单,它使用比较属性来比较密码并确认密码。当我输入不同的密码时,它会执行应有的操作并显示“密码不匹配”。当我点击提交按钮并“发布”它时,问题就出现了。我在 ModelState 无效的“if (!ModelState.IsValid)”处打了一个断点。当它重新加载曾经显示“密码不匹配”的页面时,它现在显示“找不到名为密码的属性”。我尝试按照this post 所说的尝试输入答案的代码。它返回的只是错误为“null”。 剃刀页面:

@page
@model ThinBlueLie.Pages.RegisterModel

@{
    ViewBag.Title = "Register";
}


<div class="container-fluid h-100 row nogap">
    <div class="card border-secondary mx-auto center col-lg-3 col-md-4 p-0" style="margin-top:100px;">
        <div class="card-header">
            Register
            <a class="float-right" asp-page="/Login">Login</a>
        </div>
        <form method="post">
            <div class="card-body text-secondary">
                <div class="form-group">
                    <label asp-for="Users.Email" class="control-label">Email</label>
                    <input type="email" asp-for="Users.Email" class="form-control">
                    <span asp-validation-for="Users.Email" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label  asp-for="Password"class="control-label"></label>
                    <input asp-for="Password" type="password" class="form-control" >
                    <span asp-validation-for="Password" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="ConfirmPassword" class="control-label"></label>
                    <input type="password" asp-for="ConfirmPassword" class="form-control">
                    <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
                </div>                      
                <div class="form-group">
                    <label asp-for="Users.Username" class="control-label"></label>
                    <input type="text" asp-for="Users.Username" class="form-control">
                    <span asp-validation-for="Users.Username" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <input type="submit" value="Register" class="btn btn-primary mb-1" style="float:right" />
                </div>
            </div>
        </form>
        <div class="card-footer">
            <a>Log in with Google</a>
        </div>
    </div>
</div>

@section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }

页面模型:

namespace ThinBlueLie.Pages
{
    public class RegisterModel : PageModel
    {
        private readonly DataAccessLibrary.thinblue.ThinbluelieContext _context;

        public RegisterModel(DataAccessLibrary.thinblue.ThinbluelieContext context)
        {
            _context = context;
        }

        public IActionResult OnGet()
        {
            return Page();
        }

        
        public Users Users { get; set; }        

        [BindProperty]
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Required]
        [BindProperty]
        [DataType(DataType.Password)]
        [Display(Name = "Confirm Password")]
        [Compare("Password", ErrorMessage = "Passwords do not match")]
        public string ConfirmPassword { get; set; }

        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://aka.ms/RazorPagesCRUD.



        public async Task<IActionResult> OnPostAsync()
        {
            var errors = ModelState.Values.SelectMany(v => v.Errors);
            if (!ModelState.IsValid)
            {
                return Page();
            }           

            _context.Users.Add(Users);
             await _context.SaveChangesAsync();

             return RedirectToPage("./Index");        
         
        }
    }
} 

型号:

namespace DataAccessLibrary.thinblue
{
    public partial class Users
    {
        public int IdUsers { get; set; }

        [BindProperty]
        public string Username { get; set; }

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

        
        public string Password { get; set; }
    }
}

【问题讨论】:

    标签: c# asp.net-core razor razor-pages


    【解决方案1】:

    我重现了你的错误,我将PasswordConfirmPassword放在同一个模型中,它可以工作。这是一个演示:

    密码模型:

    public class PassWordModel
        {
            [BindProperty]
            [Required]
            [DataType(DataType.Password)]
            public string Password { get; set; }
    
            [Required]
            [BindProperty]
            [DataType(DataType.Password)]
            [Display(Name = "Confirm Password")]
            [Compare("Password", ErrorMessage = "Passwords do not match")]
            public string ConfirmPassword { get; set; }
        }
    

    cshtml.cs:

    public class RegisterModel : PageModel
        {
    
            public IActionResult OnGet()
            {
                return Page();
            }
    
    
            public Users Users { get; set; }
            [BindProperty]
            public PassWordModel passWordModel { get; set; }
       
            public async Task<IActionResult> OnPostAsync()
            {
                if (!ModelState.IsValid)
                {
                    return Page();
                }
    
    
                return RedirectToPage("./Index");
    
            }
        }
    

    cshtml:

    <div class="container-fluid h-100 row nogap">
        <div class="card border-secondary mx-auto center col-lg-3 col-md-4 p-0" style="margin-top:100px;">
            <div class="card-header">
                Register
                <a class="float-right" asp-page="/Login">Login</a>
            </div>
            <form method="post">
                <div class="card-body text-secondary">
                    <div class="form-group">
                        <label asp-for="Users.Email" class="control-label">Email</label>
                        <input type="email" asp-for="Users.Email" class="form-control">
                        <span asp-validation-for="Users.Email" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="passWordModel.Password" class="control-label"></label>
                        <input asp-for="passWordModel.Password" type="password" class="form-control">
                        <span asp-validation-for="passWordModel.Password" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="passWordModel.ConfirmPassword" class="control-label"></label>
                        <input type="password" asp-for="passWordModel.ConfirmPassword" class="form-control">
                        <span asp-validation-for="passWordModel.ConfirmPassword" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <label asp-for="Users.Username" class="control-label"></label>
                        <input type="text" asp-for="Users.Username" class="form-control">
                        <span asp-validation-for="Users.Username" class="text-danger"></span>
                    </div>
                    <div class="form-group">
                        <input type="submit" value="Register" class="btn btn-primary mb-1" style="float:right" />
                    </div>
                </div>
            </form>
            <div class="card-footer">
                <a>Log in with Google</a>
            </div>
        </div>
    </div>
    
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }
    

    结果:

    【讨论】:

    • 感谢您的回复,我在某个时候解决了它,但丢失了确切的位置。我认为这是因为我的房产位于错误的位置。我将它们移到一个单独的模型中并且它起作用了。这可能与我继承 PageModel 有关
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多