0


我正在使用 C# 和 SQL Server 2005 开发一个 ASP .Net MVC 3 应用程序。我也在使用带有代码优先方法的实体框架。

我有一个 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  %>!

当我执行时,我有这个错误:

你调用的对象是空的。

4

2 回答 2

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 在博客中详细介绍了子行为here

于 2013-05-09T12:11:28.147 回答
1

尝试使用session

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

并且您可以使用以下方式获取用户名,<% var User =Session["user"]%>也可以直接使用: <% var User =this.User.Identity.Name;%>

于 2013-05-09T12:11:38.420 回答