Asp.net MVC Принудительное обновление файла javascript в комплекте - PullRequest
1 голос
/ 29 мая 2019

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

Например, если моя ссылка такая:

<script src="myfile.js" />

Браузер будет кэшировать файл javascript, и когда я опубликую новый, он не получит, сохраняя старый. Поэтому я изменил ссылку на:

<script src="myfile.js?ver=2" />

Поскольку браузер индексирует кэш по URL, он будет думать, что это другой файл, и получит его снова.

Но как я могу это сделать, если мой javascript находится в комплекте asp.net?

bundles.Add(new ScriptBundle("~/bundles/global").Include(
               "~/Scripts/my/global.js"));

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

bundles.Add(new ScriptBundle("~/bundles/global").Include(
               "~/Scripts/my/global.js?ver=2",

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Лично я терпеть не могу упаковщик, и всегда управлял своими сценариями вручную. Так что этот ответ может быть не совсем тем, что вы ищете, но поможет устранить необходимость вручную обновлять ?ver=# каждый раз.

Создайте класс, возможно FileVersionRepo, который при запуске приложения (внутри Global.asax) будет содержать private static Dictionary<string,string>, где ключом является имя файла, а значением является значение FileInfo.LastWriteTime.ToFileTime().ToString(). Это будет считывать файл lastWriteTime только один раз при перезапуске пула приложений или публикации приложения.

Это также удобно для файлов CSS.

public static class FileVersionRepo {
    private static Object _lock = new Object();
    private static Dictionary<string,string> fileVals = new Dictionary<string,string>();

    public string GetVal(string key) { return fileVals[key]; }
    public string SetVal(string key, string path) {
        lock (_lock)
        {
            var fileInfo = new FileInfo(path);
            if (fileInfo.Exists)
                FileWriteTimes[key] = fileInfo.LastWriteTime.ToFileTime().ToString();
            else
                return;// maybe throw exception here?
        }
    }
}

Тогда в вашем Global.asax.cs:

protected virtual void Application_Start(object sender, EventArgs e)
{
    ...
    FileVersionRepo.SetVal("global.js", "path/global.js");
}

Тогда в вашем представлении:

using FileVersionRepo;

<script src="global.js?ver=@FileVersionRepo.GetVal("global.js")"><script>
0 голосов
/ 03 июня 2019

Проект MVC по умолчанию создает пакет jquery, как показано ниже

Я думаю, что ваш пакет должен быть таким:

       bundles.Add(new ScriptBundle("~/bundles/global").Include(
           "~/Scripts/jquery-{version}.js",

Надеюсь, это поможет!

...