2013-11-19 2 views
-2

Я пытаюсь изменить проект MVC по умолчанию, чтобы вместо отображения имени пользователя я мог отображать их полное имя. Например, приложение по умолчанию показываетИзменение MVC-приложения по умолчанию для отображения дополнительных свойств

Hello <username>! Log off 

Я добавил новое свойство ПолноеИмя в класса ApplicationUser. Код, который показывает название в настоящее время:

@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Manage", "Account", routeValues:=Nothing, htmlAttributes:=New With {.title = "Manage"}) 

Так как я могу получить, что поиск значения из класса ApplicationUser и отобразить его здесь? Кроме того, есть ли способ кэшировать это? Кажется, что отходы выполняют поиск по каждому запросу.

Возможно, мне также захочется указать свой адрес электронной почты, поэтому мне обязательно нужно использовать новое свойство.

ответ

-1

несколько способов сделать это.

Если приложение не слишком большое, вы можете кэшировать пользовательские модели, которые вступают в систему в течение определенного периода времени, чтобы вы могли вытащить всю информацию о пользователе на основе имени пользователя.

Вы можете сохранить список, если информация в User.Identity, включая имя пользователя, ПгвЬЫате, фамилия и т.д., разделяя их запятой или т.п.

плохой путь: каждый раз, когда вы нуждаетесь в дополнительной информации, нажмите базы данных и получить их.

Мое мнение: запомните последних пользователей, которые вошли в систему на определенное количество времени. вы сможете создавать слабые решения, используя наличные деньги. сообщите мне, если вам нужна информация.

+0

почему вниз ставка ?! этот ответ абсолютно не прав. –

1

Я вообще люблю сериализовать объект пользователя в FormsAuthentication куки при их входе в систему, а затем создать класс, унаследованный от IPrincipal так, что мои взгляды могут читать десериализуются объект:

public interface IUserPrincipal : IPrincipal 
{ 
    int Id { get; set; } 
    string FirstName { get; set; } 
    string LastName { get; set; } 
    string Username { get; set; } 
} 

public class UserPrincipal : IUserPrincipal 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Username { get; set; } 

    public IIdentity Identity { get; private set; } 

    public UserPrincipal(string Username) 
    { 
     this.Identity = new GenericIdentity(Username); 
    } 
} 

public class UserPrincipalPoco 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Username { get; set; } 
} 

, а затем при проверке подлинности :

public ActionResult Login(LoginViewModel vm, string ReturnUrl) 
{ 
    // Check for valid authentication 
    if (_authenticationService.Authenticate(vm.Username, vm.Password)) 
    { 
     // Add forms authentication cookie 
     Response.Cookies.Add(GetFormsAuthenticationCookie(vm.Username)); 

     // Redirect after authentication 
    }  

    // Failed authentication, redirect to unauthorized 
} 

private HttpCookie GetFormsAuthenticationCookie(string Username) 
{ 
    var user = _userService.GetUserByUsername(Username); 

    UserPrincipalPoco pocoModel = new UserPrincipalPoco(); 
    pocoModel.Id = user.Id.Value; 
    pocoModel.FirstName = user.FirstName; 
    pocoModel.LastName = user.LastName; 
    pocoModel.Username = Username; 

    JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    string userData = serializer.Serialize(pocoModel); 

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
     1, 
     Username, 
     DateTime.Now, 
     DateTime.Now.AddMinutes(15), 
     false, 
     userData); 

    string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

    return new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
} 

, а затем в Global.asax.cs:

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

      JavaScriptSerializer serializer = new JavaScriptSerializer(); 

      UserPrincipalPoco serializeModel = serializer.Deserialize<UserPrincipalPoco>(authTicket.UserData); 

      UserPrincipal newUser = new UserPrincipal(authTicket.Name); 
      newUser.Id = serializeModel.Id; 
      newUser.FirstName = serializeModel.FirstName; 
      newUser.LastName = serializeModel.LastName; 
      newUser.Username = serializeModel.Username; 

      HttpContext.Current.User = newUser; 
     } 
    } 

Теперь вам нужно создать BaseViewPage, который наследуется от WebViewPage сказать своим видом использовать UserPrincipal объект:

public abstract class BaseViewPage : WebViewPage 
{ 
    public virtual new UserPrincipal User 
    { 
     get { return base.User as UserPrincipal; } 
    } 
} 

public abstract class BaseViewPage<TModel> : WebViewPage<TModel> 
{ 
    public virtual new UserPrincipal User 
    { 
     get { return base.User as UserPrincipal; } 
    } 
} 

и в вашем Web.config сказать своим видом всегда использовать этот BaseViewPage:

<pages pageBaseType="MyNameSpace.Views.BaseViewPage"> 

Теперь в моих взглядах я могу получить доступ к пользователю, как:

@User.Username 

или

@User.FirstName @User.LastName 
+0

Я попытался вставить это в приложение MVC по умолчанию, и у меня есть две проблемы. Во-первых, @ User.FirstName (или любое из свойств) недоступно в представлении. Во-вторых, когда я нажимаю «logoff», вошедшее в систему имя пользователя по-прежнему появляется. – WhiskerBiscuit

+0

Извините, я забыл, что вам нужно создать BaseViewPage и сообщить, что ваш Web.config всегда будет использовать этот вид View, чтобы вы могли получить доступ к вашему объекту UserPrincipal. Я отредактировал ответ выше. Кроме того, вам все равно необходимо проверить @if (User.Identity.IsAuthenticated) и убедиться, что вы выходите через FormsAuthentication.SignOut(); –

Смежные вопросы