1

我在我的页面中使用 Directoryservices 登录。我需要将用户名传递给我的母版页以在所有页面中显示用户名。

我得到了用户名并将其存储在 ViewData 中。如何在 masterpage 中传递 viewdata 值。
我的代码:

 [HttpPost]
    public ActionResult Index(LoginModels model)
    {
        if (ModelState.IsValid)
        {
            string DisplayUserName = string.Empty;
            string LoginUser = model.Userid;
            string LoginPassword = model.Password;    
            string  name = model.UserName
            if (ValidateActiveDirectoryLogin(LoginUser, LoginPassword, out DisplayUserName) == true)
            {
                model.UserName = DisplayUserName;
                ViewData["UserName"] = "Welcome" + DisplayUserName;
                return RedirectToAction("Index", "MPP", new { UserID = LoginUser });
            }          
            else
            {
                ModelState.AddModelError("","Invalid Username or Password");
            }               
        }
        return View();          
    }

在布局页面中:

   @{  @ViewData["UserName"]   }


我尝试了以下方式来显示用户名。但它会抛出空异常。
编辑 :

@foreach (var m in IEnumerable<SampleECommerce.Models.LoginModels>)ViewData["UserName"])
{ 
    @m.UserName
} 
4

4 回答 4

4

有一些误解,比如如果你设置ViewData["UserName"]一个字符串值,你会得到一个IEnumerable<SampleECommerce.Models.LoginModels>. 这是另一个解决方案:

把它放到布局页面:

<span>@{Html.RenderAction("actionname", "controllername");}</span>

并在相关行动中:

 public ActionResult actionname() {
        string result = getusername();
        return Content(result);
    }


[NoneAction]
private string getusername(){
    return (Membership.GetUser()!= null) ? Membership.GetUser().UserName : "Guest";
}
于 2012-10-30T12:08:21.473 回答
0

试试不用额外的@,即

   @{  ViewData["UserName"]   }
于 2012-10-30T12:05:01.707 回答
0

首先,您需要将语法更改为:

@(ViewData["UserName"])

这可能是最好的(坏的一群)。实际上,您应该寻求通过控制器User的属性(通常在您读取 cookie 的授权属性中)将用户推送到页面的User属性中 - 这样您就不会依赖类型不安全ViewData和魔法您将在每一页上使用的东西的字符串。

但无论如何......如果视图是由于最后return View();一行而呈现的,那么如果您按照我所示的那样更改语法,那么您尝试做的事情将会起作用。

如果没有,那么当您这样做时,return RedirectToAction("Index", "MPP", new { UserID = LoginUser });您需要将 UserName 推入TempData,然后在控制器上的Index操作开始时将其读回:MPP

所以:

TempData["UserName"] = "Welcome " + DisplayUserName;
return RedirectToAction("Index", "MPP", new { UserID = LoginUser });

然后在您的Index方法开始时,您需要将值拉回TempData

public class MPPController {
  public ActionResult Index(){
    ViewData["UserName"] = TempData["UserName"];
  }
}

为什么你必须这样做?因为RedirectToAction不呈现页面 - 它告诉客户端向新的 Url 发出不同的请求 - 因此ViewData就服务器而言,任何或模型或任何东西都会被丢弃。 是否仅在两个连续请求TempData之间提供临时存储- 因此它适用于该场景。RedirectToAction

就像我说的那样 - 这确实是一种将您的用户信息从控制器保存到视图的糟糕方法,您应该认真重新考虑它作为紧急事项。

于 2012-10-30T12:09:49.093 回答
0

在布局页面中:

<span>@{Html.RenderAction("actionname", "controllername");}</span>

在控制器中存储一个会话变量

 [HttpPost]
public ActionResult Index(LoginModels model)
{
      Session["username"] = model.UserName;
     //remaining code
}

增加一项功能

public ActionResult actionname() {

    return Content(Session["username"]);
}

所以这里我们不需要额外的功能。

于 2015-09-16T08:29:22.937 回答