2011-05-16 56 views
1

這可能是一個愚蠢的問題,但我想弄清楚如何爲顯示登錄用戶DisplayName的分部視圖填充ViewModel。此部分視圖位於主佈局中,因此它將位於每個頁面上。聽起來很簡單,我知道;但是對於我的生活,我無法弄清楚將數據傳送到視圖的最佳方式。我如何堅持這一觀點?如何填充部分視圖以在每個頁面上顯示

+0

局部視圖是強類型的嗎? – 2011-05-16 17:18:33

+0

是的,它有@model Web.ViewModels.LoggedInUserPartailViewModel – CrazyCoderz 2011-05-16 17:19:14

+0

試圖找出何時何地使用viewModel獲取數據的部分 – CrazyCoderz 2011-05-16 17:19:54

回答

3

最好的方法可能會使用兒童動作以及Html.Action helper

,以便始終在ASP.NET MVC你開始一個視圖模型,將代表你願意來操作視圖/顯示的信息:

public class UserViewModel 
{ 
    public string FullName { get; set; } 
} 

然後控制器:

public class UsersController: Controller 
{ 
    // TODO: usual constructor injection here for 
    // a repository, etc, ..., omitted for simplicity 

    public ActionResult Index() 
    { 
     var name = string.Empty; 
     if (User.Identity.IsAuthenticated) 
     { 
      name = _repository.GetFullName(User.Identity.Name); 
     } 
     var model = new UserViewModel 
     { 
      FullName = name 
     }; 
     return PartialView(model); 
    } 
} 

相應的局部視圖:

@model UserViewModel 
{ 
    // Just to make sure that someone doesn't modify 
    // the controller code and returns a View instead of 
    // a PartialView in the action because in this case 
    // a StackOverflowException will be thrown (if the child action 
    // is part of the layout) 
    Layout = null; 
} 
<div>Hello @Model.FullName</div> 

然後繼續在你的_layout,包括這個動作:

@Html.Action("Index", "Users") 

顯然下次改進這個代碼是避免打在每個請求的數據庫,但某處存儲這些信息,一旦用戶登錄,因爲它會出現在所有頁面上。優秀的地方是例如加密認證cookie的用戶數據部分(當然,如果你使用FormsAuthentication),Session,...

+0

所以部分視圖的名稱必須與ActionResult的名稱相同? – CrazyCoderz 2011-05-16 18:44:57

+0

@助理助理,是的,通常的ASP.NET MVC約定。它應該位於'〜/ Views/Users/Index.cshtml'文件夾中。 'Users',因爲那是我在我的例子和'Index'中使用的控制器的名稱,因爲這是我在示例中使用的動作的名稱。 – 2011-05-16 18:46:02

+0

我明白了。我使用的建議命名爲部分視圖,以_開頭,例如_LoggedInUserPartial.cshtml,它位於視圖/共享文件夾中。 – CrazyCoderz 2011-05-16 18:53:29

0

你可以看看有一個孩子的行動方法。

相關問題