在视图中显示相关表中的值

Posted

技术标签:

【中文标题】在视图中显示相关表中的值【英文标题】:Display value from related table in View 【发布时间】:2020-05-08 21:35:05 【问题描述】:

我创建了一个带有 MVC 5 Internet 应用程序的模型,然后首先从数据库中添加到 ADO.Net 实体数据模型 > 代码中。 我在新创建的表中添加了一个外键,链接到 AspNetUsers 表中的 ID。

我创建了默认控制器,然后创建了带有实体框架的视图,一切正常。

用户名显示在下拉菜单中,代码如下

@html.DropDownList("UserID", null, htmlAttributes: new  @class = "form-control" )

因此将其更改为以下内容,以便将其作为只读字段

    <div class="form-group">
        @Html.LabelFor(model => model.UserID, "Username", htmlAttributes: new  @class = "control-label col-md-2" )
        <div class="col-md-10">
            @Html.DisplayFor(model => model.UserID)
            @Html.HiddenFor(model => model.UserID)
        </div>
    </div>

使用此线程上的答案作为指导 Display EditorFor() value as Read-Only on MVC View? 我正在使用 VS 2013 MVC 5 以及所有更新。我怎样才能显示用户名?我需要用新方法调整控制器吗? (我上面有 UserId,因为我希望在修改后的代码中显示一些值,这样我就可以缩小问题所在)

根据要求

public partial class BaseContext : DbContext

    public BaseContext() : base("name=BaseContext") 

    public virtual DbSet<C__MigrationHistory> C__MigrationHistory  get; set; 
    public virtual DbSet<AspNetRole> AspNetRoles  get; set; 
    public virtual DbSet<AspNetUserClaim> AspNetUserClaims  get; set; 
    public virtual DbSet<AspNetUserLogin> AspNetUserLogins  get; set; 
    public virtual DbSet<AspNetUser> AspNetUsers  get; set; 
    public virtual DbSet<Customer> Customers  get; set; 
    public virtual DbSet<Organisation> Organisations  get; set; 
    public virtual DbSet<InternationalOffice> InternationalOffices  get; set; 
    public virtual DbSet<NewsType> NewsTypes  get; set; 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.Entity<AspNetRole>()
            .HasMany(e => e.AspNetUsers)
            .WithMany(e => e.AspNetRoles)
            .Map(m => m.ToTable("AspNetUserRoles").MapLeftKey("RoleId").MapRightKey("UserId"));

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.AspNetUserClaims)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.AspNetUserLogins)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserID)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.Organisations)
            .WithRequired(e => e.AspNetUser)
            .HasForeignKey(e => e.UserID)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Organisation>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.Organisation)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Organisation>()
            .HasMany(e => e.InternationalOffices)
            .WithRequired(e => e.Organisation)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<NewsType>()
            .HasMany(e => e.Customers)
            .WithRequired(e => e.NewsType)
            .WillCascadeOnDelete(false);
    

【问题讨论】:

你能分享你的模型和你的实体关系(DbSet配置)吗? 请看原帖。我现在已经添加了。我想这就是你所追求的 我猜你这里有一个强类型视图。您能否告诉我们您的视图绑定到什么model?该模型实体是否具有username 的属性?理想情况下,最好使用视图模型而不是数据库模型来绑定到您的视图。 它绑定到组织。这是使用我第一句话中的步骤生成的,不是我手动完成的 【参考方案1】:

由于您的视图与 Organization 类绑定,并且它没有 UserName 属性,因此您需要使用导航属性才能在视图上显示它。

    <div class="form-group">
        @Html.LabelFor(model => model.UserID, "Username", htmlAttributes: new  @class = "control-label col-md-2" )
        <div class="col-md-10">
            @Html.DisplayFor(model => model.AspNetUser.UserName)
            @Html.HiddenFor(model => model.UserID)
        </div>
    </div>

如果Organization.AspNetUser 为空,那么您需要使用.Include() 方法从EF 查询的数据库中返回它。

_db.Organizations.Include(i => i.AspNetUser).FirstOrDefault(i => i.id == idVariable);

你可以在https://docs.microsoft.com/en-us/ef/ef6/querying/related-data看到更多关于EF中的相关数据

【讨论】:

以上是关于在视图中显示相关表中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 SQL 的重复搜索中排除其他值中的值

SQL - 从表中连续出现的值中显示名称 ID

sql已经在视图展示的语句如何显示别的表中的内容而不改变原有的值

我们可以阻止 SQL Server 除了忽略值中的尾随空格吗

从mysql中的值中选择

ssh关于含有外键的传值中无法识别正确的action的原因和解决办法