在视图中显示相关表中的值
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已经在视图展示的语句如何显示别的表中的内容而不改变原有的值