簡體   English   中英

C# .NET 核心 3 MVC 腳手架與 EntityFrameworkCore

[英]C# .NET core 3 MVC Scaffolding with EntityFrameworkCore

我必須遵循多對多 model 結構:

 public class User
    {    
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid UserId { get; set; }

        [Required]
        [MaxLength(50)]
        public string Name{ get; set; }

        [Required]
        [MaxLength(50)]
        public string Email { get; set; }

        
        public virtual ICollection<UserInRole> UserInRoles { get; set; }
   }

 public class Role
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int RoleId { get; set; }
        public string RoleName { get; set; }
                
        public virtual ICollection<UserInRole> UserInRoles { get; set; }
    }


 public class UserInRole
    {
        [Required]        
        public Guid UserId { get; set; }
    
        [Required]       
        public int RoleId { get; set; }
    
    
        public virtual User User { get; set; }
        public virtual Role Role { get; set; }
    }

應用程序上下文:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            

            // UserInRole: set both fields as primary
            modelBuilder.Entity<UserInRole>().HasKey(table => new{ table.RoleId, table.UserId});


            modelBuilder.Entity<User>()
                .HasMany(c => c.UserInRoles);


            modelBuilder.Entity<Role>()
                .HasMany(c => c.UserInRoles);

使用正確的關系(多對多)成功創建了數據庫,但是當我創建一個新的 Controller 並使用腳手架查看時 - 系統生成 CRUD 頁面,沒有 select 選項的每個用戶的角色。 正常嗎? 我需要自己做這部分嗎?

是的,據我所知,您應該在視圖中手動渲染一對多關系。

我知道的最簡單的方法之一:

<div class="form-group">
            <label asp-for="User" class="control-label"></label>
            <select asp-for="UserId"
                    class="form-control"
                    asp-items="@(new SelectList(ViewBag.Users, "UserId", "Name"))">
            </select>
        </div>
        <div class="form-group">
            <label asp-for="Role"></label>
            <select asp-for="RoleId"
                    class="form-control"
                    asp-items="@(new SelectList(ViewBag.Roles, "RoleId", "RoleName"))">
            </select>
        </div>

在此示例中,您通過ViewBagUsersListRolesList作為SelectList發送到 View,然后在 View 上呈現它們。 據我所知,您需要手動執行以呈現一對多多對多關系,因為需要將列表轉換為SelectList以便視圖知道如何使用它。

你也可以看看這里

要創建 select 控件,首先您必須從角色列表中創建一個 SelectItem 列表:


var roleItems=dbcontext.Roles.Select(i=> new SelectListItem {
Value=i.RoleId.ToString(),
Text=i.RoleName
}).ToArray();

您可以使用 viewbag 來保留視圖的列表,但最好像這樣創建 ViewModel class

public UserViewModel
{
public User User {get; set;}
public SelectListItem[] RoleItems {get; set;} 
} 

在此之后,您可以使用此列表創建 select 輸入。 您可以使用來自@Miraziz 答案的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM