【问题标题】:How to Pass Id value of the Class?如何传递类的 Id 值?
【发布时间】:2021-04-15 22:05:26
【问题描述】:

我正在开发具有另一个类字段的用户注册。我的问题是我不明白如何将 Guid id 传递给类字段。

为了清楚起见, 我有一个 IdentityUser 模型:

        public string Name { get; set; }

        public string MiddleName { get; set; }

        [Required]
        public string Surname { get; set; }

        public DateTime BirthDate { get; set; }

        public string Address { get; set; }

        [Required]
        public string UserType { get; set; }
        public bool ParentsAgreement { get; set; }

        public Section BelongSection { get; set; }

我有 Section 模型:

        [Required]
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string CoachName { get; set; }
        public string SportComplexTitle { get; set; }
        [IgnoreDataMember]
        public ICollection<User> UsersList { get; set; }

DbContext 方法是:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            //section
            modelBuilder.Entity<User>()
                .HasOne(s => s.BelongSection)
                .WithMany(a => a.UsersList);

            modelBuilder.Entity<Section>()
                .HasMany(s => s.UsersList)
                .WithOne(a => a.BelongSection);
        }

我的注册方式是:

public async Task<AuthenticationResult> RegisterAsync(RegisterModel registerModel)
        {
            var existingUser = await _userManager.FindByNameAsync(registerModel.Username);

            if (existingUser != null)
            {
                return new AuthenticationResult
                {
                    Errors = new[] { "User with such username already exists" }
                };
            }
           
            var newUser = new User
            {
                Name = registerModel.Name,
                Surname = registerModel.Surname,
                BirthDate = registerModel.BirthDate,
                UserName = registerModel.Username,
                Email = registerModel.Email,
                PasswordHash = registerModel.PasswordHash,
                BelongSection = registerModel.BelongSection,
                UserType = registerModel.UserType
            };

            var createdUser = await _userManager.CreateAsync(newUser, registerModel.PasswordHash);
            

            if (!createdUser.Succeeded)
            {
                return new AuthenticationResult
                {
                    Errors = createdUser.Errors.Select(x => x.Description)
                };
            }

            return GenerateAuthenticationResultForUser(newUser);
        }

它的注册模型与用户模型相同,我将部分作为一个类传递。 下一步是我使用 Angular 进行 Web 开发,我在下拉列表中获取部分名称列表,并将值作为每个部分的 id 传递。 所以,我有一个带有 Section Basketball 的下拉列表,它的值 == guid id。 这就是为什么,我将值 id 从 Angular 传递到服务器,我得到“错误将类型 Guid 转换为值 Models.Section”。 我该如何处理?

【问题讨论】:

  • 您似乎包含了许多与“明确”相反的不相关代码。哪一行抛出错误?

标签: c# angular asp.net-core foreign-keys registration


【解决方案1】:
        var newUser = new User
        { 
            BelongSection = registerModel.BelongSection, 
        };

它的注册模型与我所在的用户模型相同 将 Section 作为一个类传递。下一步是我使用 Angular Web 开发,我在 下拉列表并将值作为它们每个的 id 传递。所以我 有一个带有 Section Basketball 的下拉菜单,它的值 == guid id。 这就是为什么,我将值 id 从 Angular 传递到服务器 我收到“将类型 Guid 转换为值时出错 Models.Section”。我应该如何处理?

根据您的描述,注册用户时,您似乎会使用DropDownlist列出Section,然后将所选部分的Id值传递给服务器,然后插入新用户。如果是这种情况,在注册模型中,我建议您可以添加一个 Guid 属性来存储所选部分的 Id 值,如下所示:

public class RegisterViewModel
{
    public string Name { get; set; }

    public string MiddleName { get; set; }

    [Required]
    public string Surname { get; set; }

    public DateTime BirthDate { get; set; }

    public string Address { get; set; }

    [Required]
    public string UserType { get; set; }
    public bool ParentsAgreement { get; set; }

    public Guid BelongSection { get; set; } //selected section
}

然后,在Register Post方法中,您可以根据选择的section id从数据库中找到退出的Section,然后将其分配给新用户。代码如下:

    public IActionResult Register()
    {
        //get section from database and use viewBag to bind dropdownlist.
        ViewBag.ListOfSection = _context.Sections.ToList();
        return View();
    }

    [HttpPost]
    public IActionResult Register(RegisterViewModel register)
    { 
        //find the seleted section from database.
        var selectedsection = _context.Sections.Where(c => c.Id == register.BelongSection).FirstOrDefault();
        //
        var newUser = new User
        {
            //...
            BelongSection = selectedsection,
        };

        //insert the new user into database.

        return View();
    }

截图如下:

【讨论】:

  • 非常感谢!
【解决方案2】:

如果我理解您的问题,您需要在创建新用户时创建一个 guid,但如果您使用的是支持自动 guid 生成的数据库会更好。

1.没有 Guid 生成的 DB 代码:

  var newUser = new User
        {
            Id = new Guid(),
            Name = registerModel.Name,
            Surname = registerModel.Surname,
            BirthDate = registerModel.BirthDate,
            UserName = registerModel.Username,
            Email = registerModel.Email,
            PasswordHash = registerModel.PasswordHash,
            BelongSection = registerModel.BelongSection,
            UserType = registerModel.UserType
        };

2。带有 Guid 生成的 DB 代码: 这里需要编辑DbContext

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //section
        modelBuilder.Entity<User>()
            .HasOne(s => s.BelongSection)
            .WithMany(a => a.UsersList)
            .ValueGeneratedOnAdd();

        modelBuilder.Entity<Section>()
            .HasMany(s => s.UsersList)
            .WithOne(a => a.BelongSection);
    }

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多