Использование моделей просмотра
_Layout
также может принимать модель, как виды и частичные виды.
Один из способов использовать это состоит в том, чтобы создать базовую ViewModel, обладающую свойствами, которые вам нужны в _Layout (или любом из ваших частичных представлений, отображаемых _Layout), и извлечь из этого все другие модели представлений.
public class ViewModelBase {
public string SearchText {get;}
public ViewModelBase(string searchText) {
SearchText = searchText;
}
}
public class ListModel : ViewModelBase {
public ListModel( ..., searchText) : base(searchText) {
...
}
}
В _Layout установите тип модели, и вы получите доступ к свойствам ViewModeBase и передадите значение searchText
в вызове для отображения меню.
<!-- _Layout (approximate markup) -->
@model ViewModelBase
<html>
<head></head>
<body>
@Html.Action("Menu", "Nav", Model.SearchText)
<div>
@RenderBody()
</div>
</body>
</html>
Обновите ваш NavController, чтобы он принимал текстовое значение поиска:
// Menu Controller
public class NavController : Controller
{
public PartialViewResult Menu(string searchText = null)
{
return PartialView("MenuPartial", searchText);
}
}
Обновите меню PartialView для использования модели string
и установите значение в поле поиска:
<!-- Menu PartialView -->
@model string
@using (Html.BeginForm("All", "List"))
{
@Html.TextBox("SearchText", Model) // searchText should be here
<button type="submit"></button>
}
Я рекомендую, как только вы получите эту работу, вы вернетесь и предоставите Menu PartialView свою собственную модель представления, которая содержит свойство SearchText
.
Модели просмотра и ViewBag
Представление моделей должно быть предпочтительнее, чем ViewBag. Полное объяснение можно найти здесь, ViewModels или ViewBag? , но краткий обзор преимуществ:
- Проверка времени компиляции
- Возможность рефакторинга с уверенностью
- Поддержка IDE - например, возможность перехода ко всем видам использования
- Intellisense