。Net Core 3.0表格ModelState始终无效

问题描述 投票:-2回答:1

我正在将一个较旧的.Net 4.5网站移植到Core 3.0并遇到Razor身份页面及其工作方式方面的一些问题,

例如,在应用程序的注册页面上,如下所示,表单已完全填写,但是当单击按钮时,我在Register.cs文件的PostAsync方法中命中了断点,绑定了输入模型,所有内容始终为null,但Enum除外,我在html中设置了初始选择的值。

注意:是的,我看到了代码文件中的输入内容,这不是我在截取屏幕截图后就摆脱的问题

Form error

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

    public class InputModel
    {
        [Required]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Required]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Required]
        [Display(Name = "Gender")]
        public Gender Gender { get; set; }

        [Required]
        [Phone]
        [Display(Name = "MobilePhone")]
        public string MobilePhone { get; set; }

        [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; }
    }

并且在我的启动文件中

 services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
            .ConfigureApiBehaviorOptions(options =>
            {
                options.SuppressConsumesConstraintForFormFileParameters = true;
                options.SuppressInferBindingSourcesForParameters = true;
                options.SuppressModelStateInvalidFilter = true;
                options.SuppressMapClientErrors = true;

            });

关于表单状态始终为null的ModelState为什么总是无效的任何想法?

这里是表单的html。

<form asp-route-returnUrl="@Model.ReturnUrl"
                      class="form-horizontal push-50-t push-50 form-register"
                      method="post">
                    <div asp-validation-summary="All" class="text-danger"></div>
                    <!-- form entry - first name -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.FirstName"></label>
                                <input asp-for="Input.FirstName" type="text"
                                       id="register-firstname" name="register-firstname" 
                                       class="form-control" placeholder="Enter your first name" />
                                <span asp-validation-for="Input.FirstName" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <!-- form entry - last name -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.LastName"></label>
                                <input asp-for="Input.LastName" type="text"
                                       id="register-lastname" name="register-lastname"
                                       class="form-control" placeholder="Enter your last name" />
                                <span asp-validation-for="Input.LastName" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <!-- form entry - gender -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.Gender"></label>
                                <select class="form-control" asp-for="Input.Gender"  id="register-gender" name="register-gender"
                                        placeholder="Please enter Male/Female">
                                <option selected="selected" value="@Gender.Male">Male</option>
                                <option  value="@Gender.Female">Female</option>

                                </select>
                                <span asp-validation-for="Input.Gender" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <!-- form entry - mobile phone -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.MobilePhone"></label>
                                <input asp-for="Input.MobilePhone" type="tel"
                                       id="register-mobilephone" name="register-mobilephone"
                                       class="form-control" placeholder="Provide your mobile phone number" />
                                <span asp-validation-for="Input.MobilePhone" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <!-- form entry - email -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.Email"></label>
                                <input asp-for="Input.Email" 
                                       type="email" id="register-email" name="register-email"
                                       class="form-control" placeholder="Your email address" />
                                <span asp-validation-for="Input.Email" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <!-- form entry - password -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.Password"></label>
                                <input asp-for="Input.Password" 
                                       type="password" id="register-password" name="register-password"
                                       class="form-control" placeholder="Choose a strong password" />
                                <span asp-validation-for="Input.Password" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <!-- form entry - confirm password -->
                    <div class="form-group">
                        <div class="col-xs-12">
                            <div class="form-material form-material-success">
                                <label asp-for="Input.ConfirmPassword"></label>
                                <input asp-for="Input.ConfirmPassword" 
                                       type="password" id="register-password2" name="register-password2"
                                       class="form-control" placeholder="Confirm your password" />
                                <span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-xs-7 col-sm-8">
                            <label class="css-input switch switch-sm switch-success">
                                <input type="checkbox" id="register-terms" name="register-terms"><span></span> I agree with terms &amp; conditions
                            </label>
                        </div>
                        <div class="col-xs-5 col-sm-4">
                            <div class="font-s13 text-right push-5-t">
                                <a href="#" data-toggle="modal" data-target="#modal-terms">View Terms</a>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-xs-12 col-sm-6 col-sm-offset-3">
                            <button id="register-button" class="btn btn-sm btn-block btn-success" type="submit">Create Account</button>
                        </div>
                    </div>
                </form>
                <!-- END Register Form -->

更新:根据评论者的请求,这是请求付款。

enter image description here

c# modelstate asp.net-core-3.0
1个回答
0
投票

经过数小时的辛苦尝试和错误,简单的答案是html标记中的name属性必须是模型属性名称。

我将其发布为答案,以便所有遇到此问题的其他人都可以在这里轻松找到解决方案。

即这是导致每个属性失败的原因

 <!-- form entry - email -->
   <div class="form-group">
      <div class="col-xs-12">
         <div class="form-material form-material-success">
            <label asp-for="Input.Email"></label>
            <input asp-for="Input.Email" type="email" id="register-email" **name="register-email"**
                class="form-control" placeholder="Your email address" />
           <span asp-validation-for="Input.Email" class="text-danger"></span>
        </div>
    </div>
 </div>

名称属性必须是模型属性因此将html中的所有名称属性更改为Input.ModelPropertyName,例如上例中的name =“ Input.Email”解决了该问题。

© www.soinside.com 2019 - 2024. All rights reserved.