2016-10-02 13 views
0

私は自分のテーブルで参照している都市の名前を表示したいが、AspNetUserはできない。 これはIndexViewModelsです:テーブル内の参照の名前を表示する方法AspNetUsers

public class IndexViewModel { 
    public bool HasPassword { get; set; } 
    public IList<UserLoginInfo> Logins { get; set; } 
    public string PhoneNumber { get; set; } 
    public bool TwoFactor { get; set; } 
    public bool BrowserRemembered { get; set; } 

    public string Nombre { get; set; } 
    public string Apellido { get; set; } 
    public string Direccion { get; set; } 
    public string Pais { get; set; } 
    public int LocalidadID { get; set; } 
    public string CodigoPostal { get; set; } 
    public string Telefono { get; set; } 
    public virtual Localidad Localidad { get; set; } 
} 

これは、クラスApplicationUserのIdentityModelsです:

public class ApplicationUser : IdentityUser { 
    public int LocalidadID { get; set; } 
    public string Nombre { get; set; } 
    public string Apellido { get; set; } 
    public string Direccion { get; set; } 
    public string Pais { get; set; }   
    public string CodigoPostal { get; set; }   
    public string Telefono { get; set; } 
    public System.DateTime FechaRegistro { get; set; } 

    // FOREIGN KEY 
    public virtual Localidad Localidad { get; set; } 

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 
} 

これは、コントローラのインデックス

public async Task<ActionResult> Index(ManageMessageId? message) 
    { 

     if (User.Identity.Name.Equals("[email protected]")) 
      return RedirectToAction("GuestIndex"); 

     var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     var store = new UserStore<ApplicationUser>(new ApplicationDbContext()); 
     var ctx = store.Context; 
     var usuario = manager.FindById(User.Identity.GetUserId()); 
     ApplicationDbContext db = new ApplicationDbContext(); 

     var model = new IndexViewModel 
     { 
      HasPassword = HasPassword(), 
      PhoneNumber = await UserManager.GetPhoneNumberAsync(User.Identity.GetUserId()), 
      TwoFactor = await UserManager.GetTwoFactorEnabledAsync(User.Identity.GetUserId()), 
      Logins = await UserManager.GetLoginsAsync(User.Identity.GetUserId()), 
      BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(User.Identity.GetUserId()), 
      Direccion = usuario.Direccion, 
      Nombre = usuario.Nombre, 
      Apellido = usuario.Apellido, 
      Telefono = usuario.Telefono, 
      LocalidadID = usuario.LocalidadID, 
      //Localidades = db.Localidades.Where(l => l.LocalidadID==usuario.LocalidadID).Select(l => new {Nombre = l.Nombre}), 
      CodigoPostal = usuario.CodigoPostal 
     };    
     return View(model); 
    } 

そして、私のビューである私は私にエラーをスロー:

<p>Argentina, @Model.Localidad.Departamento.Provincia.Nombre</p> 

エラー:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

+0

「Localidad」とは何ですか? – Hadee

+0

Localidad =都市、Departamento =部門、Provincia =州。 :-) – Max

答えて

0

LocalidadDepartamento.Provinciaはロードされず、おそらくLocalidadです。

Localidad = (from l in db.Localidades where l.LocalidadID == usuario.LocalidadID select l).First<Localidad>() 

まま:

LocalidadID = db.Localidads.Include("Departamento.Provincia.").Where(a=>a.LocalidadId == usuario .LocalidadID) 
+0

ありがとうございますが、私に次のエラーがスローされます: 'System.Linq.IQueryable 'タイプを暗黙的に 'int'に変換できません。 – Max

+0

ありがとうございました!私は羊飼いにしました、私は変換エラーを見て、私はこの方法を使用して、代わりに外国キーを割り当てる "LocalidadID"は、LOCALITYモデルに割り当てられています。 Localidad =(l.Localidadesのl.LocalidadID == usuario.LocalidadIDを選択します。l).First ()、 – Max

1

ソリューションは、次の行を追加しました:

あなたがIncludeを使用してコンテキストからそれをロードするか、別のクエリで明示的に 元にそれをロードする必要があります

public async Task<ActionResult> Index(ManageMessageId? message) 
{ 

    if (User.Identity.Name.Equals("[email protected]")) 
     return RedirectToAction("GuestIndex"); 

    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
    var store = new UserStore<ApplicationUser>(new ApplicationDbContext()); 
    var ctx = store.Context; 
    var usuario = manager.FindById(User.Identity.GetUserId()); 
    ApplicationDbContext db = new ApplicationDbContext(); 

    var model = new IndexViewModel 
    { 
     HasPassword = HasPassword(), 
     PhoneNumber = await UserManager.GetPhoneNumberAsync(User.Identity.GetUserId()), 
     TwoFactor = await UserManager.GetTwoFactorEnabledAsync(User.Identity.GetUserId()), 
     Logins = await UserManager.GetLoginsAsync(User.Identity.GetUserId()), 
     BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(User.Identity.GetUserId()), 
     Direccion = usuario.Direccion, 
     Nombre = usuario.Nombre, 
     Apellido = usuario.Apellido, 
     Telefono = usuario.Telefono, 
     LocalidadID = usuario.LocalidadID, 
     Localidad = (from l in db.Localidades where l.LocalidadID == usuario.LocalidadID select l).First<Localidad>(), 
     CodigoPostal = usuario.CodigoPostal 
    };    
    return View(model); 
} 
+0

準備完了! ........ – Max

関連する問題