2016-10-02 1 views
0

Je veux afficher le nom de la ville que j'ai référencé dans ma table mais je ne peux pas utiliser AspNetUser. Voici les IndexViewModels:Comment afficher le nom de la référence dans ma table 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; } 
} 

C'est IdentityModels de classe ApplicationUser .:

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; 
    } 
} 

C'est le contrôleur Index

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); 
    } 

Et mon avis je me jette l'erreur:

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

Erreur: La référence d'objet n'est pas définie sur une instance d'un objet.

+0

Qu'est-ce que 'Localidad'? – Hadee

+0

Localidad = ville, Departamento = département, Provincia = État. :-) – Max

Répondre

0

Le Departamento.Provincia du Localidad ne sera pas chargé, et peut-être le Localidad lui-même.

Vous devez charger depuis le contexte en utilisant Include ou le charger explicitement dans une autre requête ex:

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

merci mais me jette l'erreur suivante: Impossible de convertir le type 'System.Linq.IQueryable ' en 'int' – Max

+0

Merci beaucoup! J'ai guidé, j'ai utilisé de cette façon que j'ai regardé l'erreur de conversion, et au lieu d'assigner la clé étrangère "LocalidadID" est affecté à la LOCALITÉ du modèle. Localidad = (de l dans db.Localidades où l.LocalidadID == usuario.LocalidadID sélectionnez l) .Premier (), – Max

1

La solution a été d'ajouter la ligne suivante:

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

Quitter la fonctionne comme ceci:

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

Prêt! ........ – Max