2012-03-18 72 views
1

我是一个新手,所以我想我的问题是微不足道的。asp.net mvc displayFor不显示子实体值

我用CodeFirst创建了一个简单的数据库。我有一个名为Person的实体,另一个名为LocationPerson有一个名为LocationIdForeignKey属性和Location类型的另一个属性以供参考。

我创建了一个视图,其中有一个窗体可以用来创建新的Person记录。

其中一个表单域是一个人的'位置'的DropDownList。它需要一个Id值并将其分配给PersonLocationId属性。

该视图引用create控制器操作,该操作接收Person作为参数,并使用person属性绑定到表单字段。然后,它执行SaveChanges()DBContext,并将其重定向到具有特定Person'Id`的名为details的另一个Action。

Details在接收到的Id上产生一个find,并将结果(Person)发送到视图进行展示。

这是我的问题:
我尝试显示我通过的特定'Person'的位置txt,并且什么也没得到。 我这样做:

@Html.DisplayFor(model => model.Location.LocationValue) 

模型当然是一个'人'。 为什么我对此没有任何价值?

下面的代码:

public class Person 
    { 
     public int PersonId { get; set; 
     public string LocationId { get; set; } 
     ... 
     public virtual Location Location { get; set; } 
    } 

    public class Location 
     { 

      public int LocationId { get; set; } 
      public string LocationValue { get; set; } 

      public virtual ICollection<Person> Persons { get; set; } 
     } 

    public ActionResult Detailes(int id) 
    { 
     Person person = db.Persons.Find(id); 

     return View(person); 
    } 

    [HttpPost] 
    public ActionResult AddPerson(Person person) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Persons.Add(person); 
      db.SaveChanges(); 
      return RedirectToAction("Detailes", new {id = person.PersonId}); 
     } 
     return View(GetAddPersonViewModel()); 
    } 

这里的模型是形式的视图模型

@Html.DropDownListFor(model => model.Person.LocationId, Model.LocationsList) 

再次,在 '细节' 观点的陈述:

 @Html.DisplayFor(model => model.Location.LocationValue) 

谢谢。

+0

什么是位置值的类型?你为什么不使用'Html.TextBoxFor'? – gideon 2012-03-18 10:57:40

+0

如果您发布定义外键的Person/Location类和配置类将有助于确定问题 – Jayanga 2012-03-18 11:15:00

+0

'LocationValue'是字符串类型。它拥有该位置的名称。 TextBox是用于输入,我只需要一个它的值的演示文稿。 – 2012-03-18 11:16:44

回答

0

如果您尚未设置任何配置来映射Person和Location之间的关系,则可能会发生这种情况。这里是一个示例配置类

public class LocationConfiguration : EntityTypeConfiguration<Location> 
    { 
     public LocationConfiguration() 
     { 
      HasKey(a => a.Id); 
      HasMany(location => location.Persons).WithOptional(person => person.Location). 
       HasForeignKey(person => person.LocationId); 
     } 
    } 

与此配置添加到您的上下文如下

public class YourContext : DbContext 
    { 

     // your DBSets and contructors, etc 


     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Configurations.Add(new LocationConfiguration());    
      base.OnModelCreating(modelBuilder); 
     } 


    } 

问候

+0

谢谢。真相是我很喜欢MvcMusicStore教程。如果你看那里,就不需要地图配置......你也可能会注意到,从DB的图表中可以看出这些连接是自解释的。 – 2012-03-18 11:45:50

+0

试试这个,并检查你的程序是否工作。如果这有帮助,请将此标记为答案:) – Jayanga 2012-03-18 11:50:24

+0

我做到了。我得到了这个错误消息:\ tSystem.Data.Entity.Edm.EdmAssociationConstraint::参照约束的从属角色中的所有属性的类型必须与主体角色中相应的属性类型相同。实体'Person'上的属性'LocationId'的类型与参照约束'Location_Persons'中的实体'Location'上的属性'LocationId'的类型不匹配。红色标记的行是“行32:@ Html.DropDownListFor(model => model.Person.LocationId,Model.LocationsList)” – 2012-03-18 12:00:25