ASP.Net Core PWA Cache Query - PullRequest
       26

ASP.Net Core PWA Cache Query

0 голосов
/ 05 февраля 2019

Asp.Net Core 2.2.Приложение MVC, которое я пытаюсь превратить в Прогрессивное веб-приложение (PWA) с использованием пакета Mads Kristensen's WebEssentials.AspNetCore.PWA https://github.com/madskristensen/WebEssentials.AspNetCore.ServiceWorker, и у меня возникают некоторые проблемы, обеспечивающие работу определенных страниц в автономном режиме.

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

Мой вопрос: поскольку содержимое базы данных редко изменяется, могу ли я кэшировать результат запроса, чтобы все приложение моглоработать оффлайн?И если да, то как лучше всего это делать?

Мой маршрут карты по умолчанию - controller / action / id, поэтому при попытке использовать routToPreCache в appsettings.json Я не могу включить идентификатор для вновь созданного«инцидент», поэтому он не работает - я пропустил простой трюк или решение намного сложнее?

Мой контроллер для представления выглядит следующим образом:

public class PathwayController : Controller
{
    private readonly ApplicationDbContext _context;

    public PathwayController(ApplicationDbContext context)
    {
        _context = context;
    }

    public ActionResult Pathway(int? id, int? index)
    {
        int currentIndex = index.GetValueOrDefault();
        if (currentIndex == 0)
        {
            ViewBag.NextIndex = 1;
        }
        else
        {
            ViewBag.NextIndex = index + 1;
        }

        PathwayViewModel path = new PathwayViewModel();
        var incident = _context.Incident
            .Include(i => i.IncidentType)
            .FirstOrDefault(m => m.Id == id);
        path.Incident = incident;
        var stageConditions = _context.StageCondition.Where(x => x.IncidentTypeId == incident.IncidentTypeId)
            .Include(s => s.Stage)
            .Include(o => o.Stage.Outcome)
            .OrderBy(x => x.Id)
            .Skip(currentIndex)
            .Take(1)
            .FirstOrDefault();

        path.StageCondition = stageConditions;

        // Validation
        var stageConditionTest = _context.StageCondition.Where(x => x.IncidentTypeId == incident.IncidentTypeId);

        ViewBag.MaxIndex = stageConditionTest.Count();

        //save stage to incident
        incident.StageId = stageConditions.Stage.Id;

        _context.Update(incident);
        _context.SaveChanges();

        return View(path);
    }

1 Ответ

0 голосов
/ 05 февраля 2019

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

Утилита Mads PWA прекрасно работает, но она несколько защищает вас от работника сервиса и файлов манифеста.

Вам необходимо установить манифест для кэширования страницы «вопросов».Это скажет PWA идти вперед и автоматически кэшировать страницу на устройстве пользователя, при этом пользователь никогда не посещал ее.Таким образом, когда они в автономном режиме, они появятся, когда они в конечном итоге перейдут на эту страницу.

Однако, если пользователь находится в автономном режиме, отправка данных пользователем включает две вещи: сохранение значений ответа в локальном хранилище (неслишком сложно), а затем синхронизирует локальное хранилище браузера пользователя, вызывая событие, когда устройство подключено к сети, и затем отправляя эти данные в удаленную (вашу) базу данных (довольно сложно, следовательно, сложно).

Надеюсь, чтопомогает.

...