Сохранение частичного просмотра информации об обновлении страницы в MVC - PullRequest
0 голосов
/ 16 мая 2019

Страница имеет список кнопок в левом боковом меню.Первоначально страница отображается с этим левым боковым меню и частичным видом на главном экране.Когда пользователь нажимает одну из кнопок меню на левой стороне, в контейнере отображается соответствующий частичный вид.

Эта идея описана здесь на этой диаграмме:

enter image description here

Каждый частичный вид по очереди имеет нумерацию страниц.Предположим, что пользователь находится на странице 4 частичного просмотра 2 и обновляет страницу, она возвращается на целевую страницу.

Мне нужно выяснить, как хранить частичную информацию о просмотре до обновления страницы, а также информацию о номере ее страницы, чтобы пользователь мог получить доступ к тому же интерфейсу при обновлении страницы.

Этот код изначально используется для установки родительского представления:

public ActionResult ShopOnline()
{ 
    var list = db.Items.Include(i => i.Brand).Include(i => i.Category).ToList();
    var Cats = db.Categories.OrderBy(x => x.Name).ToList();
    var SubCats = db.SubCategories.OrderBy(x => x.Name).ToList();
    var FurtherSubCats = db.FurtherSubCategories.OrderBy(x => x.Name).ToList();

    Dictionary<string, int> cattot = new Dictionary<string, int>();
    for (int j = 0; j < Cats.Count; j++)
    {
        var catName = Cats[j].Name.ToString();
        var result = db.Items.Count(x => x.Category.Name == catName);
        cattot.Add(Cats[j].Name, result);
    }
    Dictionary<string, int> SubCategoriesWithTotal = new Dictionary<string, int>();
    for (int i = 0; i < SubCats.Count; i++)
    {
        var SubCategoryName = SubCats[i].Name.ToString();
        var SubCategoryTotal = db.Items.Count(x => x.SubCategoryName == SubCategoryName);
        SubCategoriesWithTotal.Add(SubCats[i].Name, SubCategoryTotal);
    }
    Dictionary<string, int> FurtherSubCatsWithTotal = new Dictionary<string, int>();
    for (int k = 0; k < FurtherSubCats.Count; k++)
    {
        var FurtherSubCategoryName = FurtherSubCats[k].Name.ToString();
        var SubCategoryTotal = db.Items.Count(x => x.FurtherCategoryName == FurtherSubCategoryName);
        FurtherSubCatsWithTotal.Add(FurtherSubCats[k].Name, SubCategoryTotal);
    }
    var vm = new ShopOnlineVM
        {
            ListOfItems = list,
            SubCategories = SubCats,
            FurtherSubCategories = FurtherSubCats,
            CategoryNames = cattot,
            SubCategoryNames = SubCategoriesWithTotal,
            FurtherSubCatsNames = FurtherSubCatsWithTotal
        };
    return View(vm);
}

Страница, полученная из этого кода, имеет список меню слева.Поэтому, когда пользователь нажимает на один из его элементов, в этом родительском представлении устанавливается частичное представление, относящееся к этому.Код для этого:

using PagedList;
public ActionResult GetCategoryItems(string categoryName, int? page)
    {
        var itemList = db.Items.Where(x => x.CategoryName == categoryName).ToList().ToPagedList(page ?? 1, 30); 
        return PartialView("_categoryDetails", itemList);
    } 

Частичное представление

@using PagedList;
@using PagedList.Mvc;
@model IPagedList<OnlineStore.Models.Item>    
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>    
<div id="itemsInACategory">
    <div id="wrapper-Details" class="wrapper">
        @foreach (var item in Model)
        { //...items are rendered }
    </div>
    @Html.PagedListPager(Model, page => Url.Action("GetCategoryItems", new { page, categoryName = Model.First().CategoryName }), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(new AjaxOptions() { HttpMethod = "GET", UpdateTargetId = "itemsInACategory" }))
</div>

Это повторяется для каждого элемента левого бокового меню, т.е. при щелчке по элементу отображается соответствующий частичный вид.

Что мне нужно, так это предположить, что пользователь щелкнул левой кнопкой мыши по пункту 6 меню, чтобы отобразить PartialView № 6, а PartialView № 6 имеет 10 страниц, и пользователь находится на странице 7, и обновляет страницу, сейчас она возвращает пользователя назад.на родительскую страницу (целевую страницу), очевидно, потому что - это , который обновляет сам пользователь страницы, у которого нет информации о визуализированном частичном представлении в его URL.

Я не уверен, как убедиться, что пользователь нажимает на очень релевантное частичное представление после нажатия кнопки обновления.

Я применил эту существующую логику из-за левых пунктов меню (категорий).Эти категории имеют подкатегории, которые имеют дополнительные подкатегории, и когда пользователь первоначально щелкает по элементу категории, все элементы списка категорий сдвигаются влево (искусственно исчезают), а подкатегории, относящиеся к этим категориям, перемещаются и повторяются длякаждая подкатегория нажмите, чтобы показать дополнительную подкатегорию.Все это происходит с левой стороны и с правой (основной) части страницы, релевантным для PartialView является рендеринг.

Теперь, если я изменю логику для сохранения в URL-адресе информации о названии категории, подкатегории или дополнительной подкатегории, а также номера страницы и маршрута к другому действию и, следовательно, к новой странице (представлению), яЯ не уверен, как скользить соответствующее левое боковое меню, показывая точную точку зрения (то есть, категория, подкатегория - или далее подкатегория).

Рабочий пример того, чего мне нужно достичь, находится здесь (https://shop.coles.com.au/a/a-national/everything/browse1)

1 Ответ

0 голосов
/ 16 мая 2019

На основе кода вы можете использовать сеанс сервера для сохранения этих данных. но вы должны позаботиться о том, когда он должен быть очищен, если вы ожидаете этого.

Я не запускал его, но в основном вы сохраняете запрошенную страницу в сеансе. в противном случае загрузите его из сеанса или выберите по умолчанию. Сессия сохраняет его по частичному ключу страницы.

код контроллера

     private Dictionary<string, int> SavedPaging
    {
        get
        {
            var saved = (Dictionary<string, int>)Session[nameof(SavedPaging)];
            if (saved is null)
            {
                Session[nameof(SavedPaging)] = saved = new Dictionary<string, int>();
            }

            return saved;
        }
        set { Session[nameof(SavedPaging)] = value; }
    }

    public ActionResult GetCategoryItems(string categoryName, int? page)
    {
        const string pageKey = nameof(GetCategoryItems);
        if (!page.HasValue && SavedPaging.ContainsKey(pageKey))
        {
            var savedPage = SavedPaging[pageKey];
            page = savedPage;
        }
        else if(page.HasValue && !SavedPaging.ContainsKey(pageKey))
        {
            SavedPaging.Add(pageKey,page.Value);
        }
        else if(page.HasValue && SavedPaging.ContainsKey(pageKey))
        {
            SavedPaging[pageKey] = page.Value;
        }

        var itemList = db.Items.Where(x => x.CategoryName == categoryName).ToList().ToPagedList(page ?? 1, 30);
        return PartialView("_categoryDetails", itemList);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...