как создать манифест, если в ASP.NET MVC4 используется связывание и минификация

Используется сборка и минификация приложения ASP.NET MVC4 MVC4. Приложение должно работать и в офлайне.

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

<!DOCTYPE html>
<html manifest="~/Sale/Manifest">

<head>

    @Erp.Helpers.Bundles.Render("~/css/pos", new { media = "screen" })
    @Erp.Helpers.Bundles.Render("~/css/receipt", new { media = "print" })
    @Scripts.Render("~/pos.js")
</head>

контроллер:

public ContentResult Manifest()
        {
            return new ContentResult()
            {
                Content = @"CACHE MANIFEST
CACHE:
pos?v=esdw2223023094323
css/pos?v=ewe3334324r33432343
css/receipt?v=w333543334324r33432343

NETWORK:
*
"
   };
}

C# Web.Optimization Bundles и манифест кеша HTML5 содержит аналогичный вопрос без ответа.

Обновить

Я пробовал ответы, но получил ошибку в консоли Chrome

Application Cache Error event: Resource fetch failed (404) http://localhost:52216/erp/Sale/pos.js 

Приложение работает с использованием

        BundleTable.EnableOptimizations = true;

и в режиме отладки, нажав F5 из VSE 2013 для Интернета

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

public class SaleController : ControllerBase
{

    public ContentResult Manifest()
    {
        return new ContentResult()
        {
            Content = string.Format(@"CACHE MANIFEST
CACHE:
   {0}
   {1}
   {2}
", 
Scripts.Url("pos.js"),  // tried also Scripts.Url("pos")
Styles.Url("css/pos"),
Styles.Url("css/receipt")),

... в контроллере.

просмотр источника в браузере показывает

<html manifest="/erp/Sale/Manifest">
<head>
  <link href="/erp/css/pos?v=sN8iz_u3gRGE6MQKGq6KocU-SUIUMcQxKVuESa_L2l41" rel="stylesheet" media="screen"/>
    <link href="/erp/css/receipt?v=C6qCUe6W1VM6yxNe-RgZRY9R0Gws1vU0lMuoKIn1uVE1" rel="stylesheet" media="print"/>
    <script src="/erp/pos.js?v=a-TsureIIlzxwhaItWMV7Ajfw-YXE3x6hUld3cxwAqI1"></script>

сгенерированный манифест содержит

CACHE MANIFEST
CACHE:
/erp/Sale/pos.js
/erp/Sale/css/pos
/erp/Sale/css/receipt

Как это исправить? Похоже, что для манифеста генерируются недопустимые URL-адреса:

  1. Добавлен каталог распродаж
  2. Строка запроса отсутствует

person Andrus    schedule 15.12.2013    source источник


Ответы (3)


Существуют методы для объектов Styles и Scripts в System.Web.Optimization, которые дадут вам URL-адрес ресурса.

Вы можете вызвать Scripts.Url(string), чтобы получить URL-адрес файла сценария вместе с хэшем. Вы также можете вызвать Styles.Url(string), чтобы получить URL-адрес таблицы стилей вместе с хэшем.

using System.Web.Optimization;
using System.Web.Mvc;

namespace StackOverflow.Controllers
{
    public class StackOverflowController : Controller
    {
        public ContentResult Manifest()
        {
            return new ContentResult()
            {
                Content = string.Format( 
@"CACHE MANIFEST
CACHE:
{0}
{1}
{2}

NETWORK:
*
",
 Scripts.Url("~/pos.js"),
 Styles.Url("~/css/pos"),
 Styles.Url("~/css/receipt"))
            };
        }
    }
}

Хэши для очистки кеша будут добавлены только тогда, когда сайт запускается с <compilation debug="false" />, указанным в файле web.config.

person Pervez Choudhury    schedule 15.12.2013
comment
Спасибо. В этом образце не используется полное имя пакета. Следует ли использовать ~/pos.js вместо pos? В режиме отладки объединение отключено и ссылаются на несколько файлов. Как заставить это работать автоматически без связывания? - person Andrus; 16.12.2013
comment
Первез Чоудхури: Я попробовал это, но получил явную ошибку выборки. Я обновил вопрос. Как исправить ? - person Andrus; 16.12.2013
comment
@Andrus - я добавил относительные URL-адреса в код и добавил примечание о том, когда видны параметры строки запроса. - person Pervez Choudhury; 16.12.2013
comment
Bundle содержит множество файлов css и js. Ваше решение отображает только один файл, поэтому оно не будет работать в режиме отладки. Должен ли я использовать решение с kazimanzurrashid.com /сообщения/ ? Похоже, эта работа в режиме отладки тоже так ли это? - person Andrus; 17.12.2013

Scripts.Url дает вам URL-адрес пакета без отображения тегов скрипта. Это отвечает на ваш вопрос?

person samjudson    schedule 15.12.2013
comment
Я попробовал это, но получил явную ошибку выборки. Я обновил вопрос. Как исправить ? - person Andrus; 16.12.2013
comment
Вы передаете в Scripts.Url то же самое, что и в Scripts.Render — то есть имя вашего пакета. В приведенном выше примере у вас есть ~/pos.js в качестве имени вашего пакета. - person samjudson; 16.12.2013

Вы можете использовать Scripts.RenderFormat или Styles.RenderFormat для отображения полного списка файлов при запуске с debug="true" и только уменьшенную версию при запуске с debug="false".

Вот пример:

    public ActionResult AppManifest()
    {
        string cacheFiles = "";

        cacheFiles = Scripts.RenderFormat("{0}",
            "~/bundles/jquery",
            "~/bundles/jqueryval",
            "~/bundles/bootstrap").ToString();

        cacheFiles += Styles.RenderFormat("{0}",
            "~/Content/css");

        string manifest = String.Format(@"CACHE MANIFEST

  CACHE:
  {0}", cacheFiles);

        return Content(manifest, "text/cache-manifest");
    }
person Hugo    schedule 13.02.2017