В настоящее время я разрабатываю веб-сайт, который позволяет пользователям настраивать различные аспекты.
Я смог загружать, извлекать и кэшировать пользовательские правила CSS, а также изображения, однако строки ускользают от меня. Я использую ASP.net MVC5.
Вот код, который у меня есть до сих пор:
FileController:
[HttpGet]
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Server)]
public ContentResult getString()
{
string randString = getStringFromDatabase(); //retrieves hard coded string for now
if (randString != null && randString.Length > 0)
return Content(randString);
else
return null;
}
Затем с этим контроллером я планирую использовать @Url.Action для вызова вышеуказанного метода в FileController и получения строки. Я ранее мог извлекать изображения (поскольку вы добавляете действие url в атрибут src тега img), а также загружаете пользовательский файл CSS (поскольку вы добавляете действие url в атрибут src тега ссылки), оба из них кэшируются с помощью аналогичный код к вышесказанному.
Я достигаю этого с помощью таких изображений:
<img class="navbar-logo" src="@Url.Action( "image", "file", new { name = "Logo.png" })" />
и хотел бы сделать это со строками.
Я попытался использовать функцию jQuery $.get, но затем он не кэширует строку и не загружает строку после каждой загрузки страницы.
Если это помогает, я пытаюсь сохранить пользовательский заголовок страницы в базе данных, а затем извлекать его при первой загрузке и кэшировать его.
TL; DR: У меня есть строка, хранящаяся в базе данных. Я хочу получить эту строку через действие бритвы (Url.Action или другие) и показать ее пользователю веб-страницы. Я также хочу его кэшировать. Я могу сделать это с изображениями и css файлами, потому что теги <img>
и <link>
имеют атрибуты src, но <p>/<span>
и другие текстовые элементы этого не делают.
Если вам нужна дополнительная информация, просто дайте мне знать!
Поэтому я понял это со ссылкой, предоставленной DaveParsons (см. Комментарии по моему оригинальному вопросу).
По сути, мне не нужно было использовать @Url.Action, ответ был @Html.Action:
<h4 id="page-title">@Html.Action("GetTitle", "file", new { type = "pagetitle" })</h4>
Но это возвращало ошибку, говоря, что вы не можете установить местоположение outputcache с дочерним действием, поскольку оно поддерживает только атрибуты Duration, VaryByCustom и VaryByParam. Я пробовал его без места, но попытка сбросить кеш не работала, поэтому я полностью удалил атрибут, и теперь он кэширует заголовок, а также удаляется при его обновлении.
Поэтому мне пришлось создать новый блок кода внутри контроллера:
[HttpGet]
public ContentResult GetTitle(string type)
{
string titleString = getStringFromByte(this.DataProvider.CustomizationFileManager.LoadCustomizationFile("WebsitePageTitle.txt"));
if (titleString != null && titleString.Length > 0)
return Content(titleString);
else
return Content("");
}
Мой ответ кажется немного запутанным (пока еще не был кофе). Поэтому я предоставлю...
TL; DR: используйте @Html.Action. Удалите атрибут [OutputCache] из метода контроллера.