2016-08-09 64 views
5

In der ASP.Net MVC 5 kann die ApplicationUser erweitert werden, um benutzerdefinierte Eigenschaft zu haben. Ich habe es so erweitert, dass es jetzt eine neue Eigenschaft hat DisplayName genannt:Wie erhält man den benutzerdefinierten Eigenschaftswert des ApplicationUser in der ASP.Net MVC 5 View?

// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. 
public class ApplicationUser : IdentityUser { 
    public string ConfirmationToken { get; set; } 
    public string DisplayName { get; set; } //here it is! 

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

Ich habe auch die Datenbanktabelle mit Update-Database Befehl in den Package-Manager Console in Visual Studio aktualisiert, um die Konsistenz zwischen den ApplicationUserclass und der AspNetUsers Tabelle zu gewährleisten. Ich habe bestätigt, dass die neue Spalte DisplayName jetzt in der Tabelle AspNetUsers vorhanden ist.

enter image description here

Jetzt möchte ich, dass DisplayName anstelle der Standard verwenden UserName für den Text in der Original _LoginPartial.cshtmlView. Aber wie Sie sehen können:

<ul class="nav navbar-nav navbar-right"> 
    <li> 
    @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" }) 
    </li> 
    <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> 
</ul> 

Die ursprüngliche _LoginPartialView.cshtml wird User.Identity.GetUserName() mit dem UserName des ApplicationUser zu bekommen. Die User.Identity hat GetUserId und auch Name, AuthenticationType, etc ... Aber wie bekomme ich meine DisplayName für die Anzeige?

Antwort

5

den Anspruch in ClaimsIdentity hinzufügen:

public class ApplicationUser : IdentityUser 
{ 
    ... 

    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 
     userIdentity.AddClaim(new Claim("DisplayName", DisplayName)); 
     return userIdentity; 
    } 
} 

eine Erweiterung Methode Erstellt Display von ClaimsIdentity zu lesen:

public static class IdentityExtensions 
{ 
    public static string GetDisplayName(this IIdentity identity) 
    { 
     if (identity == null) 
     { 
      throw new ArgumentNullException("identity"); 
     } 
     var ci = identity as ClaimsIdentity; 
     if (ci != null) 
     { 
      return ci.FindFirstValue("DisplayName"); 
     } 
     return null;   
    } 
} 

Ihrer Ansicht verwenden Sie es mögen:

User.Identity.GetDisplayName() 
+0

Dies scheint vielversprechend ... wo platzieren Sie normalerweise Ihre 'IdentiyExtensions' Methode? In der 'IdentityModels.cs'? Oder würden Sie eine neue Datei mit bestimmter Namenskonvention dafür erstellen? – Ian

+0

Ich würde eine neue Datei mit dem Namen "IdentityExtensions.cs" erstellen, wahrscheinlich in einem Ordner namens "Helpers" – tmg

+0

Danke für Ihre Antwort! Es klappt! Ich mache jedoch eine kleine Änderung ... anstatt Return 'claim.FindFirst (" DisplayName ")' 'zurückzugeben, gebe ich' return claim.FindFirst ("DisplayName") zurück. ToString(). Substring (("DisplayName:"). Length); '- weil' claim.FindFirst ("DisplayName") 'vom Typ' Claim' ist, aber 'return' muss eine' string' sein. Wenn ich den 'Substring' nicht anschließe, wird' DisplayName: myname' anstelle von 'myname' angezeigt. – Ian