2016-07-28 2 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);' или 'return 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.

Создайте модель BaseViewModel в методе OnResultExecuting вместо OnActionExecuted. И сохраните модель в ViewData, чтобы получить доступ к ней в частичном просмотре.

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 в частичный вид частичного просмотра.

E.g.

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

В частичном просмотре _Header вы можете просто получить доступ к данным.

<div id="logo"> 
    <h1>Hello @Model.currentUser.username</ h1 > 
</div> 
Смежные вопросы