如何将Viewdata值传递给Razor MVC 4中的母版页

时间:2012-10-30 11:59:35

标签: c# asp.net asp.net-mvc-3 master-pages

我在“我的页面”中使用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 个答案:

答案 0 :(得分:3)

存在一些误解,例如,如果您将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";
}

答案 1 :(得分:0)

尝试没有额外的@,即

   @{  ViewData["UserName"]   }

答案 2 :(得分:0)

您需要将语法更改为:

@(ViewData["UserName"])

这可能是最好的(的坏束)。实际上,您应该通过控制器的User属性将用户推送到页面的User属性中(通常在授权属性中,也许您可​​以读取cookie) - 就这样不要依赖于类型不安全ViewData和魔术字符串,而是要在 每个页面 上使用。

但无论如何......如果视图是由于最后一个return View();行而渲染的话,那么如果你按照我的方式更改语法,那么你想要做的就会有用。

如果没有,那么当您执行return RedirectToAction("Index", "MPP", new { UserID = LoginUser });时,您需要将UserName推送到TempData,然后在您{{1}的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"]; } } 不呈现页面 - 它告诉客户端对新的Url发出不同的请求 - 因此任何RedirectToAction或模型或其他任何内容都会被丢弃到服务器。 ViewData仅在 两个连续请求之间提供临时存储 - 因此它适用于TempData方案。

就像我说的那样 - 这实际上是一种将用户信息从控制器持续查看的糟糕方式,你应该认真地重新考虑它。

答案 3 :(得分: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"]);
}

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