Сохранить ASP.NET атрибуты пользователя основной идентификации в другой таблице

#sql-server #asp.net-mvc #asp.net-core-mvc #asp.net-identity

Вопрос:

Я разрабатываю ASP .СЕТЕВОЕ основное веб-приложение. Я использую платформу пользовательского интерфейса идентификации для регистрации и авторизации пользователей в приложении. Я наследую идентификатор пользователя для своего ApplicationUser класса следующим образом. Он создает таблицу с именем as ApplicationUser и успешно сохраняет соответствующие данные в соответствии с заданными атрибутами: (Я использую Microsoft SQL базу данных)

ApplicationUser.cs

 using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;

#nullable disable

namespace WebApp.Models
{
        public partial class ApplicationUser : IdentityUser<int>
        {
            public ApplicationUser()
            {
            }

            public string FirstName { get; set; }
            public string MiddleName { get; set; }
            public string LastNam { get; set; }
            public DateTime? DateOfBirth { get; set; }
            public string Bio { get; set; }

            public virtual UserAddress UserAddress { get; set; }
        }
}
 

Затем я реализовал UserAddress класс модели следующим образом. Он создает другую таблицу в базе данных с именем «Адрес пользователя».

Адрес пользователя.cs

 using System;
using System.Collections.Generic;

#nullable disable

namespace WebApp.Models
{
    public partial class UserAddress
    {
        public int UserId { get; set; }
        public string BuildingNo { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }

        public virtual ApplicationUser User { get; set; }
    }
}
 

Затем в папке «Области» в работе с фреймами пользовательского интерфейса Identity я изменяю файл Index.cshtml следующим образом. я вставляю новую запись, чтобы ввести имя building number пользователя, которое должно быть сохранено в UserAddress таблице в базе данных.

Index.cshtml

 @page
@model IndexModel
@{
    ViewData["Title"] = "Profile";
    ViewData["ActivePage"] = ManageNavPages.Index;
}

<h4>@ViewData["Title"]</h4>
<partial name="_StatusMessage" model="Model.StatusMessage" />
<div class="row">
    <div class="col-md-12">
        <form id="profile-form" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="=row d-flex flex-row">
                <div class="form-group col-md-6">
                    <label asp-for="Input.UserName"></label>
                    <input asp-for="Input.UserName" class="form-control" />
                </div>
            </div>
            <div class="=row d-flex flex-row">
                <div class="form-group col-md-6">
                    <label asp-for="Input.FirstName"></label>
                    <input asp-for="Input.FirstName" class="form-control" />
                </div>
                <div class="form-group col-md-6">
                    <label asp-for="Input.MiddleName"></label>
                    <input asp-for="Input.MiddleName" class="form-control" />
                </div>
            </div>
            <div class="=row d-flex flex-row">
                <div class="form-group col-md-6">
                    <label asp-for="Input.LastNam"></label>
                    <input asp-for="Input.LastNam" class="form-control" />
                </div>
            </div>
            <div class="=row d-flex flex-row">
                <div class="form-group col-md-6">
                    <label asp-for="Input.DateOfBirth"></label>
                    <input asp-for="Input.DateOfBirth" class="form-control" />
                </div>
                <div class="form-group col-md-6">
                    <label asp-for="Input.PhoneNumber"></label>
                    <input asp-for="Input.PhoneNumber" class="form-control" />
                    <span asp-validation-for="Input.PhoneNumber" class="text-danger"></span>
                </div>
             </div>
             <div class="=row d-flex flex-row">
                <div class="form-group col-md-6">
                        <label asp-for="Input.BuildingNo"></label>
                        <input asp-for="Input.BuildingNo" class="form-control" />
                </div>
             </div>
            <div class="=row d-flex flex-row">
                <div class="do-md-6">
                    <button id="update-profile-button" type="submit" class="btn btn-primary">Save</button>
                </div>
            </div>
         </form>
    </div>
</div>

@section Scripts {
    <partial name="_ValidationScriptsPartial" />
} 

And in the Index.cshtml.cs file, I tried to save the building number in the UserAddress table as follows but it fails to enter the data into the table.

Index.cshtml.cs

 using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using WebApp.Models;

namespace WebApp.Areas.Identity.Pages.Account.Manage
{
    public partial class IndexModel : PageModel
    {
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly SignInManager<ApplicationUser> _signInManager;

        public IndexModel(
            UserManager<ApplicationUser> userManager,
            SignInManager<ApplicationUser> signInManager)
        {
            _userManager = userManager;
            _signInManager = signInManager;
        }

        public string BuildingNo { get; set; }
        public string Username { get; set; }

        [TempData]
        public string StatusMessage { get; set; }

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

        public class InputModel
        {

            [DataType(DataType.Text)]
            [Display(Name = "User Name")]
            public string UserName { get; set; }

            [DataType(DataType.Text)]
            [Display(Name = "First name")]
            public string FirstName { get; set; }


            [DataType(DataType.Text)]
            [Display(Name = "Middle name")]
            public string MiddleName { get; set; }


            [DataType(DataType.Text)]
            [Display(Name = "Last name")]
            public string LastNam { get; set; }


            [Display(Name = "Date of Birth")]
            [DataType(DataType.Date)]
            public DateTime DateOfBirth { get; set; }

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

            [Display(Name = "Building No:")]
            [DataType(DataType.Text)]
            public string BuildingNo { get; set; }
        }

        private async Task LoadAsync(ApplicationUser user)
        {
            var userName = await _userManager.GetUserNameAsync(user);
            var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
            Username = userName;
            Input = new InputModel
            {
                UserName = user.UserName,
                FirstName = user.FirstName,
                MiddleName = user.MiddleName,
                LastNam = user.LastNam,
                PhoneNumber = phoneNumber, 
            };
            
        }

        public async Task<IActionResult> OnGetAsync()
        {
            var user = await _userManager.GetUserAsync(User);
            if (user == null)
            {
                return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

            await LoadAsync(user);
            return Page();
        }

        public async Task<IActionResult> OnPostAsync()
        {
            var user = await _userManager.GetUserAsync(User);
            if (user == null)
            {
                return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

            if (!ModelState.IsValid)
            {
                await LoadAsync(user);
                return Page();
            }

            var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
            if (Input.PhoneNumber != phoneNumber)
            {
                var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
                if (!setPhoneResult.Succeeded)
                {
                    StatusMessage = "Unexpected error when trying to set phone number.";
                    return RedirectToPage();
                }
            }
            if(Input.FirstName != user.FirstName)
            {
                user.FirstName = Input.FirstName;
            }

            if (Input.MiddleName != user.MiddleName)
            {
                user.MiddleName = Input.MiddleName;
            }
            if (Input.LastNam != user.LastNam)
            {
                user.LastNam = Input.LastNam;
            }
            if (Input.DateOfBirth != user.DateOfBirth)
            {
                user.DateOfBirth = Input.DateOfBirth;
            }
            if (Input.UserName != user.UserName)
            {
                user.UserName = Input.UserName;
            }
            
            user.UserAddress.BuildingNo = Input.BuildingNo; // I tried to enter the building address to the UserAddress table by using this code

            await _userManager.UpdateAsync(user);

            await _signInManager.RefreshSignInAsync(user);
            StatusMessage = "Your profile has been updated";
            return RedirectToPage();
        }
    }
}
 

Пожалуйста, проигнорируйте приведенный выше длинный Index.cshtml.cs код, который я предоставил, я прокомментировал рядом с единственным кодом, который я использовал для вставки входных building number данных в таблицу адресов пользователей. который:
user.UserAddress.BuildingNo = Input.BuildingNo;

Это часть представления записи: Представление записи
И это ошибка, которую я получаю при запуске вышеуказанного кода: Сообщение об ошибке

Для записи: все поля в ApplicationUser таблице обновлены. но эта ошибка возникает, когда я пытаюсь вставить данные в UserAddress таблицу.

Я довольно пользователь, это очень простой вопрос для человека, который знает ASP.NET основной пользователь идентичности очень хорошо.

Я убедительно прошу, если кто-нибудь может, пожалуйста, помочь мне сохранить входные building number данные в другой таблице с именем User Address ?

Заранее спасибо!!!

Комментарии:

1. Не могли бы вы, пожалуйста, проверить свой user объект, есть ли у него UserAddress ? вы не можете присвоить значение, если оно имеет значение NULL. вы должны сделать это «новый адрес пользователя () {BuildingNo = Ввод. здание нет;}

Ответ №1:

Вы можете изменить свой код, как показано ниже:

Первый код использования получить текущий user включает UserAddress :

  var user = await _userManager.Users
                         .Include(x => x.UserAddress)
                         .SingleAsync(x => x.UserName== Input.UserName);
 

Затем определите UserAddress , существует ли он, и обновите его.

  if (user.UserAddress == null)
                {
                    user.UserAddress = new Models.UserAddress
                    {
                        BuildingNo = Input.BuildingNo
                    };
                }
                else
                {
                    user.UserAddress.BuildingNo = Input.BuildingNo;
                }
 

Весь код выглядит следующим образом:

 public async Task<IActionResult> OnPostAsync()
    {
        //get the current user
        var user = await _userManager.Users
                         .Include(x => x.UserAddress)
                         .SingleAsync(x => x.UserName== Input.UserName);
        if (user == null)
        {
            return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
        }

        if (!ModelState.IsValid)
        {
            await LoadAsync(user);
            return Page();
        }

        var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
        if (Input.PhoneNumber != phoneNumber)
        {
            var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
            if (!setPhoneResult.Succeeded)
            {
                StatusMessage = "Unexpected error when trying to set phone number.";
                return RedirectToPage();
            }
        }
        if(Input.FirstName != user.FirstName)
        {
            user.FirstName = Input.FirstName;
        }

        if (Input.MiddleName != user.MiddleName)
        {
            user.MiddleName = Input.MiddleName;
        }
        if (Input.LastNam != user.LastNam)
        {
            user.LastNam = Input.LastNam;
        }
        if (Input.DateOfBirth != user.DateOfBirth)
        {
            user.DateOfBirth = Input.DateOfBirth;
        }
        if (Input.UserName != user.UserName)
        {
            user.UserName = Input.UserName;
        }
        //insert the BuildingNo
        if (user.UserAddress == null)
                {
                    user.UserAddress = new Models.UserAddress
                    {
                        BuildingNo = Input.BuildingNo
                    };
                }
                else
                {
                    user.UserAddress.BuildingNo = Input.BuildingNo;
                }

        await _userManager.UpdateAsync(user);

        await _signInManager.RefreshSignInAsync(user);
        StatusMessage = "Your profile has been updated";
        return RedirectToPage();
    }
 

Комментарии:

1. Я проверю ваш код и дам вам знать, работает ли он. Большое вам спасибо за ваш ответ.