2017-08-22 20 views
0

我是ASP.Net MVC Web開發的初學者。我想知道如何在佈局文件中訪問我的ApplicationUser模型中添加的額外屬性?如何訪問佈局文件中添加到ApplicationUser的模型屬性

截至目前,如果我必須訪問剃刀文件中的屬性,我在剃刀文件頂部添加@model myModel,然後我可以通過@Model.MyProperty訪問屬性。

假設我加入FirstName財產在我Application User象下面這樣:

public class ApplicationUser : IdentityUser 
    { 
     public string FirstName { get; set; } 
    } 

現在在我的登錄偏我有下面的代碼。

@using Microsoft.AspNet.Identity 
@if (Request.IsAuthenticated) 
{ 
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) 
    { 
    @Html.AntiForgeryToken() 

    <ul class="nav navbar-nav navbar-right"> 
     <li> 
      @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" }) 
     </li> 
     <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> 
    </ul> 
    } 
} 

想我也想顯示名字,而不是User.Identity.GetUserName()我怎麼可以這樣做。

下面是註冊過程中用戶會看到的RegisterViewModel。

public class RegisterViewModel 
    { 
     // rest property removed for brevity 
     [Required] 
     public string FirstName { get; set; } 
    } 

現在返回一個視圖時,該RenderBody()是與該控制器操作的實際CSHTML文件被渲染的地方。但在我的場景中,我需要訪問佈局文件中的applicationUser屬性,這對所有人都是通用的。請指導我。

我可以做些什麼: User.Identity.GetFirstName或者沿着這些線?

回答

0
  1. 將您的登錄/註銷部分放置在單獨的視圖中,而不是在佈局視圖中。
  2. 然後從佈局視圖中調用一個動作(@ Html.Action)來呈現登錄/註銷部分。 該操作準備登錄/註銷模型並呈現單獨的視圖。

使用此方法可以將模型傳遞給包含用戶特定信息的視圖。

+0

我認爲它需要在佈局文件中。因爲頂部導航欄需要在每個頁面視圖中顯示。 – Unbreakable

+0

請再讀一遍我寫的。然後在**佈局視圖**內調用動作(@ Html.Action)。所以每個頁面都包含它。 – Raphael

+0

@ Html.Action將如何執行。它是否像部分視圖一樣呈現沒有任何用戶操作?所以,即使不加載任何頁面的頁面,只要點擊一下,actionlink就會被執行並且它內部的視圖會被渲染? 「不需要點擊」? – Unbreakable

0

創建一個新的控制器,這將是基類的所有一切都在你的應用程序控制器(假設你已經在用戶實例保存的姓名)

public class ApplicationBaseController : Controller 
     { 
      protected override void OnActionExecuted(ActionExecutedContext filterContext) 
      { 
       if (User != null) 
       { 
        var context = new ApplicationDbContext(); 
        var username = User.Identity.Name; 

        if (!string.IsNullOrEmpty(username)) 
        { 
         var user = context.Users.SingleOrDefault(u => u.UserName == username); 

         ViewData.Add("firstName", user.FirstName); 
        } 
       } 
       base.OnActionExecuted(filterContext); 
      } 

      } 

例如HomeController的繼承ApplicationBaseController如下:

public class HomeController : ApplicationBaseController 

現在改變登錄局部用下面的代碼:

@using Microsoft.AspNet.Identity 
@if (Request.IsAuthenticated) 
{ 
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) 
    { 
    @Html.AntiForgeryToken() 

    <ul class="nav navbar-nav navbar-right"> 
     <li> 
      @Html.ActionLink("Hello " + (ViewData["firstName"]) + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" }) 
     </li> 
     <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> 
    </ul> 
    } 
} 
相關問題