2013-05-09 5 views
0


Я разрабатываю приложение ASP .Net MVC 3 с использованием C# и SQL Server 2005. Я также использую платформу Entity Framework с кодом First Method.Как показать текущего пользователя с помощью ASP MVC и EF

У меня есть интерфейс для LOG ON (соединение), который связан с моей базой, где у меня есть таблица USER (содержат Логин + пароль).

Я просто хочу показать текущего пользователя, который зарегистрирован. Итак, я создал класс ViewModel для пользователя, но я не получил никакого результата. Это то, что я пытался делать в контроллере:

public ActionResult LogOn() 
     { 


      var user = new UserViewModel(); 
      user.Nom_User = this.User.Identity.Name; 
      ViewData["UserDetails"] = user; 
      return View(); 
     } 

и это то, что я добавляю в главной странице:

<% var User = ViewData["UserDetails"] as MvcApplication2.ViewModels.UserViewModel; %> 
Hello : <%: User.Nom_User %>! 

Когда я исполняю, я эту ошибку:

Ссылка на объект не установлена ​​в экземпляр объекта.

ответ

2

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

Но вы установили ViewData["UserDetails"] только внутри действия LogOn. Поэтому, когда вы переходите к какому-либо другому действию (например, к действию Home/Index), он будет бомбить, потому что в этом ViewData["UserDetails"] ничего нет, и, конечно, эта переменная User, которую вы указали в своем MasterPage, будет равна нулю.

Я бы рекомендовал вам использовать дочернее действие для этого.

[ChildActionOnly] 
public ActionResult LogedInUser() 
{ 
    if (!Request.IsAuthenticated) 
    { 
     return PartialView(); 
    } 

    var user = new UserViewModel(); 
    user.Nom_User = User.Identity.Name; 
    return PartialView(user); 
} 

и в вашем MasterPage:

<% Html.RenderAction("LogedInUser", "Account"); %> 

или, если вы предпочитаете:

<%= Html.Action("LogedInUser", "Account") %> 

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

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<UserViewModel>" 
%> 

<% if (Model != null) { %> 
    <div>Hello : <%= Html.DisplayFor(x => x.Nom_User) %></div> 
<% } %> 

Phil Haack blogged about child actions подробнее here.

+0

Спасибо за ответ, я следовать вашим указаниям, но есть ошибка компиляции относительно <% Html.RenderAction («Учетная запись», «LogedInUser»)%> – anouar

+0

Извините, я забыл хвост ';'. Это должно быть: '<% Html.RenderAction (« Учетная запись »,« LogedInUser »); %> '. Я обновил свой ответ. –

+0

Извините за беспокойство, но всегда есть эта ошибка: Контроллер для пути '/' не был найден или не реализует IController. – anouar

1

Попробуйте использовать session

Session["user"]=this.User.Identity.Name; 

и с точки зрения вы можете получить имя пользователя с <% var User =Session["user"]%> или вы можете напрямую использовать: <% var User =this.User.Identity.Name;%>

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