ASP.NET Core MVC - частичное представление отображается только на одной странице - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть частичное представление для ViewBag.count, которое определено в ShoppingCartController.Проблема в том, что ViewBag будет отображаться только тогда, когда вы находитесь в представлении ShoppingCart.Я хочу, чтобы ViewBag был виден на всех видах.Как это исправить?В настоящее время я рендерим частичное, как это:

@Html.Partial("_ShoppingCart", new List<bytme.Models.ShoppingCartModel>())

Частичное представление называется _ShoppingCart:

<span class="badge">@ViewBag.count</span>

1 Ответ

0 голосов
/ 23 ноября 2018

Вам следует создать отдельный метод действия, который возвращает HTML-разметку, необходимую для визуализации раздела корзины на вашей странице, и включать его во все ваши представления, используя метод Html.Action.

Вы также можете украсить этот метод действияChildActionOnly атрибут, чтобы пользователи не могли напрямую получить доступ к этому методу действия, запрашивая URL /ShoppingCart/Cart.

[ChildActionOnly]
public ActionResult Cart()
{
    ViewBag.ItemCount = 2;  // replace hard coded value with your actual value
    return PartialView();
}

, а в вашем частичном представлении (~/Views/Shared/Cart.cshtml) вы можете написать необходимый HTML-коддля сегмента корзины страницы.

<span class="mycart">
    Total items in cart @ViewBag.ItemCount
</span>

Здесь мы используем ViewBag для передачи числового значения количества элементов из метода действия в его частичное представление.Но вы можете использовать модель представления и использовать строго типизированный подход представления для передачи данных из вашего метода действия в частичное представление (это мой предпочтительный подход).

Теперь в другом файле представлений / файла макета, где вы хотитедля рендеринга HTML корзины, вы можете вызвать метод Html.Action

<div>
   @Html.Action("Cart","ShoppingCart")
</div>
<h1>Welcome to my site</h1>

Когда бритва выполнит ваше представление, он увидит этот метод Html.Action, который будет выполнен и выведет его (разметка HTML).сгенерированный для метода действия), будет включен в окончательный вывод, сгенерированный для текущего представления.

Я использую метод PartialView, чтобы он не пытался выполнить код макета.(Люди совершают эту ошибку и получают бесконечные вызовы к методу действий корзины.

Для основных проектов Asp.Net

Если вы хотите сделать то же самое в aspОсновные проекты .net, вы можете использовать компоненты View для достижения тех же результатов.

Создайте компонент вида для визуализации корзины.

public class CartViewComponent : ViewComponent
{        
    public IViewComponentResult Invoke(string name)
    {
        var totalItemCount = 3;
        return View(totalItemCount);
    }
}

Создайте бритвенное представление для этого компонента вида с помощьюимя Default.cshtml внутри ~/Views/Shared/Components/Cart каталога, и вы можете иметь свой бритвенный код / ​​разметку HTML внутри него для рендеринга желаемого HTML.В этом примере я использую строго типизированный подход, где мое представление строго типизировано до типа int иЯ передаю значение типа int из метода Invoke при вызове метода View.

@model int
<span>
    Total items : @Model
</span>

Теперь вы можете вызывать этот компонент представления в других файлах представлений / макетов, вызывая метод Component.InvokeAsync.

<div>
   @await Component.InvokeAsync("Cart")
</div>
<h1>Welcome to my site</h1>
...