我正在使用C#和SQL Server 2005开发一个ASP .Net MVC 3应用程序。我还使用了Entity Framework和Code First Method。
我有一个LOG ON(连接)的接口,它与我的基础相关,我有一个USER表(包含登录名+密码)。
我只是想显示记录的当前用户。所以,我为用户创建了一个ViewModel类,但我没有得到任何结果。 这就是我在Controller中尝试做的事情:
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 %>!
当我执行时,我有这个错误:
对象引用未设置为对象的实例。
答案 0 :(得分:2)
您说您已将此代码放在MasterPage中。这意味着它将针对每个视图运行。
但您只在ViewData["UserDetails"]
操作中设置了LogOn
。因此,当您导航到其他一些操作(例如Home / Index操作)时,它会爆炸,因为此ViewData["UserDetails"]
内部没有任何内容,当然您在MasterPage中声明的此User
变量将是空。
我建议你使用儿童行动。
[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)在更多细节here
上发表了关于儿童行为的博文。
答案 1 :(得分:1)
尝试使用session
Session["user"]=this.User.Identity.Name;
在视图中,您可以使用<% var User =Session["user"]%>
获取用户名,也可以直接使用:
<% var User =this.User.Identity.Name;%>