2016-07-28 66 views
1

我試圖將我的UserModel傳遞給每個視圖,以便它可以顯示當前用戶信息。把模型放在每個視圖上

這是我BaseViewModel

public class BaseViewModel 
{ 
    public UserModel currentUser { get; set; } 
} 

BaseController:

public class BaseController : Controller 
{ 
    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     UserRepository userRep = new UserRepository(); 
     BaseViewModel model = new BaseViewModel 
     { 
      currentUser = userRep.getCurrentUser() 
     }; 
     base.OnActionExecuted(filterContext); 
    } 
} 

的HomeController:(默認)

public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
     ListRepository listRep = new ListRepository(); 
     return View(listRep.GetAllLists());//returns IEnumerable<ListModel> 
    } 
} 

我的共享_layout.cshtml

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>@ViewBag.Title - My ASP.NET Application</title> 
    @Styles.Render("~/Public/css") 
</head> 
<body> 
     <header> 
      @Html.Partial("_Header") 
     </header> 
    @RenderBody() 
</body> 
</html> 

最後,我_Header.cshtml:

<div id="logo"> 
    <h1>Hello @Model.currentUser.username</ h1 > 
</div> 

但是當我運行它,我得到這個錯誤信息:

'System.Collections.Generic.List'不包含'currentUser'的定義

我想我的BaseViewModel就會讓附加

回答

2

視圖中的模型是IEnumerable<ListModel>,這就是將被傳遞到部分,除非你指定的模型,例如,使用

@Html.Partial("_Header", someOtherModel) 

相反,創建一個ChildActionOnly方法,你的用戶數據返回到_Header.cshtml局部視圖,並在主視圖中使用@Html.Action()以使其

[ChildActionOnly] 
public ActionResult _Header() 
{ 
    var model = .... // get the model you want to render in the partial 
    return PartialView(model); 
} 

,並在主視圖

@{ Html.RenderAction("_Header", controllerName); } 
+0

我應該創建一個新的控制器還是將其添加到現有的控制器?另外,無關,是否有可能返回一個不同的局部視圖,取決於用戶是否登錄? – Cornwell

+1

就個人而言,我會把它放在一個單獨的控制器(也許'UserController')中,假設你將在與多個控制器關聯的多個視圖中使用該部分 –

+1

並且您可以隨時檢查請求是否已通過身份驗證,並使用'return PartialView(「abc 「,model);''''或'返回PartialView(」xyz「,model);'(甚至模型可能不同) –

2

如果你想在每一個視圖中,您可以考慮使用調用一個Html.Action子操作方法。

所以更換

<header>@Html.Partial("_Header")</header> 

<header>@Html.Action("Header","YourControllerName")</header> 

現在有一個叫做頭的操作方法,你將通過所需要的數據,以它的局部視圖

[ChildActionOnly] 
public ActionResult Header() 
{ 
    var vm = new YourHeaderViewModel(); 
    vm.UserName="Shyju"; // Replace with whatever you want. 
    return PartialView(vm); 
} 

哪裏YourHeaderViewModel是你的查看標題所需屬性的標題模式。

public class YourHeaderViewModel 
{ 
    public string UserName {set;get;} 
} 
在頭的局部視圖

現在這是強類型到YourHeaderViewModel類,

@model YourHeaderViewModel 
<div id="logo"> 
    <h1>Hello @Model.UserName</ h1 > 
</div> 
0

使用BaseController另一種可能的解決方案。

在OnResultExecuting方法而不是OnActionExecuted中實例化BaseViewModel模型。並將模型保存在ViewData中以在_Header局部視圖中訪問它。

E.g.

public class BaseController : Controller 
    { 
     protected override void OnResultExecuting(ResultExecutingContext filterContext) 
     { 
     UserRepository userRep = new UserRepository(); 
     BaseViewModel model = new BaseViewModel 
     { 
      currentUser = userRep.getCurrentUser() 
     }; 
     filterContext.Controller.ViewData["customData"] = model; 
     } 
    } 

現在您需要將ViewData傳遞給_Header局部視圖。

E.g.

@Html.Partial("_Header", ViewData["customData"]) 

在_Header局部視圖中,您可以簡單地訪問數據。

<div id="logo"> 
    <h1>Hello @Model.currentUser.username</ h1 > 
</div> 
相關問題