2016-07-28 62 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> 
相关问题