Как передать значение из контроллера в _Layout и далее в PartialView без ViewBag? - PullRequest
0 голосов
/ 06 января 2019

Итак, у меня есть следующая архитектура приложения:

  1. NavController, ListController
  2. _Layout, который состоит из Menu (= PartialViewResult) из разделов NavController и RenderBody.

Обычно запросы отправляются в ListController в разделе RenderBody.

В меню есть текстовое поле поиска. Когда пользователь хочет что-то найти, searchText переходит к ListController в качестве параметра.

Я хочу разместить текст для поиска после нажатия «найти» в том же текстовом поле. Как я должен сделать это, чтобы сделать этот рабочий процесс красивым?

Я надеюсь, что моя картина внесет ясность. Спасибо.

appArchitecture

<!-- _Layout (approximate markup) -->
<html>
<head></head>
<body>
    @Html.Action("MenuLeft", "Nav")
    <div>
        @RenderBody()
    </div>
</body>
</html>


<!-- Menu PartialView -->
@using (Html.BeginForm("All", "List"))
{
    @Html.TextBox("SearchText", null) // searchText should be here
    <button type="submit"></button>
}


// Menu Controller
public class NavController : Controller
{
    public PartialViewResult Menu()
    {
        return PartialView("MenuPartial");
    }
}


public class ListController : Controller
{
    public ViewResult All(String searchText = null)
    {
        ...
        return View(model);
    }
}

1 Ответ

0 голосов
/ 06 января 2019

Использование моделей просмотра

_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...