我在“我的页面”中使用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
}
答案 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"]);
}
所以这里我们不需要额外的功能。