Создать нового пользователя приложения после отправки формы в ASP. NET MVC - PullRequest
0 голосов
/ 03 мая 2020

Я просмотрел свой код несколько раз и до сих пор не могу понять, что я могу делать неправильно. В моем приложении ASP. NET MVC я хочу иметь возможность создать нового пользователя после отправки формы через модель представления. Часть информации, передаваемой через модель представления, будет использоваться для заполнения модели ApplicationUser.

Вот моя модель представления

[Column(TypeName = "decimal(18,2)")]
    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "LoanAmount", ResourceType = typeof(Resources))]
    public decimal LoanAmount { get; set; }

    [Display(Name = "LoanPurpose", ResourceType = typeof(Resources))]
    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    public LoanPurpose LoanPurpose { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "FirstName", ResourceType = typeof(Resources))]
    public string FirstName { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "LastName", ResourceType = typeof(Resources))]
    public string LastName { get; set; }

    [Display(Name = "DateOfBirth", ResourceType = typeof(Resources))]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    public DateTime? DateOfBirth { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "StreetAddress", ResourceType = typeof(Resources))]
    public string Street { get; set; }

    [MaxLength(15)]
    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "City", ResourceType = typeof(Resources))]
    public string City { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "State", ResourceType = typeof(Resources))]
    public string State { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "ZIP", ResourceType = typeof(Resources))]
    public string ZipCode { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "Country", ResourceType = typeof(Resources))]
    public string Country { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "Phone", ResourceType = typeof(Resources))]
    public string Phone { get; set; }

    [Column(TypeName = "decimal(18,2)")]
    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "MonthlyHousingPayment", ResourceType = typeof(Resources))]
    public decimal MonthlyHousingPayment { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [Display(Name = "EmploymentStatus", ResourceType = typeof(Resources))]
    public EmploymentStatus EmploymentStatus { get; set; }

    [Column(TypeName = "decimal(18,2)")]
    [Display(Name = "IndividualYearlyIncome", ResourceType = typeof(Resources))]
    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    public decimal IndividualYearlyIncome { get; set; }

    [Column(TypeName = "decimal(18,2)")]
    [Display(Name = "AdditionalYearlyIncome", ResourceType = typeof(Resources))]
    public decimal? AdditionalYearlyIncome { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [EmailAddress(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "EmailInvalid")]
    [Display(Name = "Email", ResourceType = typeof(Resources))]
    public string Email { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [DataType(DataType.Password)]
    [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "StringLength", MinimumLength = 4)]
    [Display(Name = "Password", ResourceType = typeof(Resources))]
    public string Password { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    [StringLength(20, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "StringLength", MinimumLength = 4)]
    [Display(Name = "Username", ResourceType = typeof(Resources))]
    public string UserName { get; set; }

    [Required(ErrorMessageResourceType = typeof(ValidationResources), ErrorMessageResourceName = "PropertyValueRequired")]
    public bool AcceptCreditReportTerms { get; set; }

    public Guid ApplicationUserId { get; set; }
    public ApplicationUser ApplicationUser { get; set; }

Вот мой контроллер (CheckRateController)

// POST: CheckRate/Index
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Index(CheckYourRateViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser
            {
                FirstName = model.FirstName,
                LastName = model.LastName,
                UserName = model.UserName,
                PhoneNumber = model.Phone,
                DateOfBirth = model.DateOfBirth,
                State = model.State,
                Street = model.Street,
                City = model.City,
                Country = model.Country
            };

            var result = await _userManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                // Add registered users to Customer role
                await _userManager.AddToRoleAsync(user.Id, "Customer");
            }

            var loanApplication = new Loan
            {
                LoanPurpose = model.LoanPurpose,
                LoanAmount = model.LoanAmount,
                EmploymentStatus = model.EmploymentStatus,
                MonthlyHousingPayment = model.MonthlyHousingPayment,
                IndividualYearlyIncome = model.IndividualYearlyIncome,
                AdditionalYearlyIncome = model.AdditionalYearlyIncome,
                ApplicationUserId = Guid.Parse(user.Id)
            };

            db.Loans.Add(loanApplication);
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }

        return View(model);
    }

И вот как начинается мой взгляд (Index.cs html)

<section class="main-chkout">
<div class="container">
    @using (Html.BeginForm("Index", "CheckRate", FormMethod.Post))
    {
        @Html.AntiForgeryToken()

        <div class="form-horizontal">
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })

            <h1>@Resources.CheckYourRate</h1>
            <div class="col-md-8 col-sm-8 col-xs-12">
                <div class="frm-bx">
                    <h2>How much would you like to borrow?</h2>
                    <div class="frm-gap">
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.LoanAmount)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty lgap">
                                    @Html.TextBoxFor(m => m.LoanAmount, new { placeholder = @Resources.LoanAmount })
                                    <span>$</span>
                                </div>
                                @Html.ValidationMessageFor(model => model.LoanAmount, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.LoanPurpose)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.EnumDropDownListFor(model => model.LoanPurpose)
                                    <i class="fa fa-caret-down" aria-hidden="true"></i>
                                </div>
                                @Html.ValidationMessageFor(model => model.LoanPurpose, "", new { @class = "text-danger" })
                            </div>
                        </div>
                    </div>
                </div> <!-- Form tab End -->

                <div class="frm-bx">
                    <h2>Tell Us About Yourself</h2>
                    <div class="frm-gap">
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    <label for="">Full Name</label>
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="row">
                                    <div class="col-md-6">
                                        <div class="inp-sty">
                                            @Html.TextBoxFor(m => m.FirstName, new { placeholder = @Resources.FirstName })
                                        </div>
                                        @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
                                    </div>
                                    <div class="col-md-6">
                                        <div class="inp-sty">
                                            @Html.TextBoxFor(m => m.LastName, new { placeholder = @Resources.LastName })
                                        </div>
                                        @Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.DateOfBirth)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.TextBoxFor(m => m.DateOfBirth, new { placeholder = "Date of Birth (MM/DD/YYYY)" })
                                </div>
                                @Html.ValidationMessageFor(model => model.DateOfBirth, "", new { @class = "text-danger" })
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.Street)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.TextBoxFor(m => m.Street, new { placeholder = @Resources.StreetAddress })
                                </div>
                                @Html.ValidationMessageFor(model => model.Street, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    <label for="">City & State</label>
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="row">
                                    <div class="col-md-6">
                                        <div class="inp-sty">
                                            @Html.TextBoxFor(m => m.City, new { placeholder = @Resources.City })
                                        </div>
                                        @Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" })
                                    </div>
                                    <div class="col-md-6">
                                        <div class="inp-sty">
                                            <div class="inp-sty">
                                                @Html.TextBoxFor(m => m.State, new { placeholder = @Resources.State })
                                            </div>
                                            @Html.ValidationMessageFor(model => model.State, "", new { @class = "text-danger" })
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    <label for="">Zip & Phone</label>
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="row">
                                    <div class="col-md-6">
                                        <div class="inp-sty">
                                            @Html.TextBoxFor(m => m.ZipCode, new { placeholder = @Resources.ZIP })
                                        </div>
                                        @Html.ValidationMessageFor(model => model.ZipCode, "", new { @class = "text-danger" })
                                    </div>
                                    <div class="col-md-6">
                                        <div class="inp-sty">
                                            @Html.TextBoxFor(m => m.Phone, new { placeholder = @Resources.PhoneNumber })
                                        </div>
                                        @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
                                    </div>
                                </div>
                            </div>
                        </div> <!-- Row End -->

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.MonthlyHousingPayment)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.TextBoxFor(m => m.MonthlyHousingPayment, new { placeholder = @Resources.MonthlyHousingPayment })
                                </div>
                                @Html.ValidationMessageFor(model => model.MonthlyHousingPayment, "", new { @class = "text-danger" })
                            </div>
                        </div> <!-- Row End Here -->
                    </div>
                </div> <!-- Form tab End -->

                <div class="frm-bx">
                    <h2>What is your income?</h2>
                    <div class="frm-gap">
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.EmploymentStatus)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.EnumDropDownListFor(model => model.EmploymentStatus)
                                    <i class="fa fa-caret-down" aria-hidden="true"></i>
                                </div>
                                @Html.ValidationMessageFor(model => model.EmploymentStatus, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.IndividualYearlyIncome)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty lgap">
                                    @Html.TextBoxFor(m => m.IndividualYearlyIncome, new { placeholder = @Resources.IndividualYearlyIncome })
                                    <span>$</span>
                                </div>
                                @Html.ValidationMessageFor(model => model.IndividualYearlyIncome, "", new { @class = "text-danger" })
                            </div>
                        </div> <!-- Row End Here -->

                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.AdditionalYearlyIncome)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty lgap">
                                    @Html.TextBoxFor(m => m.AdditionalYearlyIncome, new { placeholder = @Resources.AdditionalYearlyIncome })
                                    <span>$</span>
                                </div>
                                @Html.ValidationMessageFor(model => model.AdditionalYearlyIncome, "", new { @class = "text-danger" })
                            </div>
                        </div> <!-- Row End Here -->
                    </div>
                </div> <!-- Form tab End -->

                <div class="frm-bx">
                    <h2>Save your information</h2>
                    <div class="frm-gap">
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.Email)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.TextBoxFor(m => m.Email, new { placeholder = @Resources.Email })
                                </div>
                                @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.UserName)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.TextBoxFor(m => m.UserName, new { placeholder = @Resources.Username })
                                </div>
                                @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" })
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-md-4 col-sm-4 col-xs-12">
                                <div class="inp-sty1">
                                    @Html.LabelFor(m => m.Password)
                                </div>
                            </div>
                            <div class="col-md-8 col-sm-8 col-xs-12">
                                <div class="inp-sty">
                                    @Html.PasswordFor(m => m.Password, new { placeholder = @Resources.Password })
                                </div>
                                @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
                            </div>
                        </div>
                    </div>
                </div> <!-- Form tab End -->
            </div> <!-- col-md-8 End -->

            <div class="col-md-4 col-sm-4 col-xs-12">
                <div class="chklst">
                    <ul>
                        <li>
                            <img src="~/Content/assets/images/stopwatch.svg" alt="">
                            <p>Check your rate in<br> 5 minutes</p>
                        </li>
                        <li>
                            <img src="~/Content/assets/images/percent.svg" alt="">
                            <p>Get lower rates</p>
                        </li>

                        <li>
                            <img src="~/Content/assets/images/wallet.svg" alt="">
                            <p>Single monthly payments</p>
                        </li>

                        <li>
                            <img src="~/Content/assets/images/calendar2.svg" alt="">
                            <p>Fixed terms—3 or 5 years*</p>
                        </li>
                    </ul>
                </div>
            </div>

            <div class="clear"></div>
            <div class="chl-txt">
                <p>The following documents contain important information, including your agreement to do business with<br> <span>Lendy</span> electronically. <span>By clicking the box below, you confirm that you agree by electronic signature to:</span></p>
            </div>

            <label class="checke">
                the Credit Report Authorization, Terms of Use and Electronic Consent, Data Terms of Use & Prosper privacy policies.

                @Html.CheckBoxFor(m => m.AcceptCreditReportTerms)
                <span class="checkmark"></span>
            </label>
            @Html.ValidationMessageFor(model => model.AcceptCreditReportTerms, "", new { @class = "text-danger" })

            <input type="submit" class="btncus" value="Check your rates" />
        </div>
    }
</div>

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Я заметил, что вы проверяете, является ли состояние модели действительным или нет в методе контроллера, используя свойство ' ModelState.IsValid ' с условием if и весь ваш код внутри этого условия if.

Проверьте, добавив точку останова в это местоположение, чтобы проверить, является ли ваша отправленная модель формы действительной или нет в данный момент, если она false , тогда ваши данные не будут сохранены в соответствии с вашей логикой c.

Другое дело, что при использовании ' ModelState.IsValid ' необходимо убедиться, что вы не публикуете недопустимые данные для определенного поля, например, если вы добавили проверку для десятичного поля в в вашей модели представления и в форме вы используете помощник по тегам TextBoxFor для этого конкретного поля, которое принимает любые символы и то же самое для других типов данных, поэтому убедитесь, что вы отправляете правильные данные в контроллер, иначе ' ModelState.IsValid 'будет ложным.

0 голосов
/ 03 мая 2020

Попробуйте обновить BeginForm, чтобы он выглядел примерно так ...

Html.BeginForm("Index", "Home", FormMethod.Post)
...