Как передать параметр на верхнюю панель навигации в ASP.NET Core Layout? - PullRequest
1 голос
/ 18 июня 2019

Внутри моего Views/Shared/_Layout.cshtml следующая панель навигации находится в <body>:

    <header>
    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container">
            <a class="navbar-brand" asp-area="" asp-controller="Client" asp-action="ClientList">Client List</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                <ul class="navbar-nav flex-grow-1">                        
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="Import">Import</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="Processing">Processing</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="PostProcessing">Post Processing</a>
                    </li>                        
                </ul>
            </div> 
        </div>
    </nav>
</header>

Как вы можете видеть, у меня есть 4 представления: ClientList, Import, Processing и PostProcessing.Внутри каждого из этих представлений у меня есть кнопки для перехода к следующему или предыдущему представлению (это по большей части последовательный процесс), и поэтому действия контроллера выполняются в идентификаторе клиента.

Когда я нахожусь,скажем, в представлении PostProcessing и попытке просмотреть представление Import, щелкнув элемент панели навигации, я получаю исключение, потому что идентификатор не передается.

ID of 0 in GET Action

AsВ качестве запасного варианта я подумывал просто взять верхнюю панель навигации из макета и сделать ее Частичным представлением или Компонентом вида и визуализировать ее на каждой странице, но так как это кажется нелогичным при использовании макета, мне интересно, есть ли способбыть в состоянии просто использовать мой существующий _Layout, а также использовать идентификатор текущего представления, которое будет отправлено, когда я нажму на ссылку.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вам придется явно передать параметр id в ваш тег привязки, возможно, используя ViewBag или TempData.

<a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="Import" asp-route-id="@ViewBag.Id">Import</a>

Подробнее о ViewBag и TempData .

0 голосов
/ 18 июня 2019

Ваше представление _NavbarPartial должно выглядеть следующим образом, где каждый помощник тега ссылки действия содержит атрибут asp-route-id="@Model".

@model int // <-- Must contain this

<a class="navbar-brand" asp-area="" asp-controller="Client" asp-action="ClientList" asp-route-id="@Model">Client List</a>

<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                aria-expanded="false" aria-label="Toggle navigation">
     <span class="navbar-toggler-icon"></span>
</button>

<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
            <ul class="navbar-nav flex-grow-1">                        
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="Import" asp-route-id="@Model">Import</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="Processing" asp-route-id="@Model">Processing</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Client" asp-action="PostProcessing" asp-route-id="@Model">Post Processing</a>
                </li>                        
            </ul>
 </div> 

Тогда в _Layout должно быть следующее:

<header>
    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container">
            <partial name="_NavbarPartial" model="1" /> // <-- Pass your id value as model
        </div>
    </nav>
</header>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...