2014-02-27 81 views
1

我想保留屏幕頂部的用戶名。我有多個視圖和控制器。即使當我導航到不同的頁面時,我也想保留相同的值。ASP.NET MVC在登錄後在站點頂部顯示用戶名

我用

@Html.DevExpress().Label(settings => 
{ 
    settings.Text = ViewBag.Name; 

    }).GetHtml() 

我在shared folder - _mainLayout加入這個標籤(這樣的標籤應該在所有的頁面可用)

我還與會話變量下,ViewData的和TempData的嘗試。但價值僅僅保留在一個視圖中。當我導航到另一個視圖時,它不會呈現。

這是如何實現的?

回答

2

如果需要當前用戶的名字,你是更好地得到這樣說:

@Html.DevExpress().Label(settings => 
{ 
    settings.Text = this.User.Identity.Name; 

}).GetHtml() 

ViewBag,ViewData的和TempData的是唯一有效的網頁上,還有你一直在移動/從重定向控制器,你在哪裏設置它們。

編輯:

//set cookie 
var cookie = new HttpCookie("username", "ElectricRouge"); 
Response.Cookies.Add(cookie); 

//Get cookie 
var val = Request.Cookies["username"].Value; 
+0

我嘗試過會議,但它不工作在不同的意見(頁)。我想保留用戶在登錄頁面的用戶名字段中輸入的值。我沒有使用任何形式的認證。這會在這個Senario中工作嗎? – ElectricRouge

+0

也許是cookie? – VladL

+0

您能否給我一個樣品? – ElectricRouge

0

該方法利用一個操作過濾器屬性類的處理上的控制器動作執行。首先,您需要創建一個新的Action Filter類,將其稱爲任何您想要的,但使其從ActionFilterAttribute類繼承。然後,您應該與ActionExecutedContext參數添加overrided OnActionExecuted方法:

public class ExampleActonFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     BaseViewModel model = filtercontext.Controller.ViewData.Model; 

     if (filterContext.Controller.ControllerContext.HttpContext.Session["UserName"] != null) 
     { 
      model.UserName = filterContext.Controller.ControllerContext.HttpContext.Session["UserName"]; 
     } 
    } 
} 

接下來,你有你的頁面佈局採取視圖模型與以用戶名作爲字符串公共字符串參數:

public class BaseViewModel() 
{ 
    public string UserName {get;set;} 
} 

然後佈局頁面上有一個簡單的檢查(你想它要繪製),以確保值不爲空,如果不是的話,把它畫像這樣:

if (string.IsNullOrWhiteSpace(@Model.UserName)) 
{ 
    <span>@Model.UserName</span> 
} 

現在,在您想要顯示用戶名的所有視圖中,只需讓該頁的ViewModel從BaseViewModel類繼承,並在需要顯示時將用戶名設置爲會話變量。

看一看這個SO發佈更多有關會話變量:here

我希望這有助於!

相關問題