Как вернуть динамический CSS с помощью ASP.NET MVC?

Мне нужно решение, которое позволяет мне выполнить следующее:

  • Возвращаемый CSS, динамически генерируемый методом действия
  • Выбор файла CSS в зависимости от параметра запроса или файла cookie
  • Использование инструмента для объединения и сжатия (минимизации) CSS

В настоящее время я рассматриваю, почему в ASP.NET MVC нет CssResult, и может ли быть причина его отсутствия. Создает ли пользовательский ActionResult не лучший способ сделать это? Есть ли другой способ, который я упустил, чтобы делать то, что мне нужно?

Любые другие предложения или подсказки, которые могут иметь значение, прежде чем я приступлю к этой задаче, также будут оценены:)

Ответы

Ответ 1

Вам нужно вернуть FileResult или ContentResult с типом контента text/css.

Например:

return Content(cssText, "text/css");
return File(cssStream, "text/css");

EDIT. Вы можете создать вспомогательный метод Css в вашем контроллере:

protected ContentResult Css(string cssText) { return Content(cssText, "text/css"); }
protected FileResult Css(Stream cssStream) { return File(cssStream, "text/css"); }

Ответ 2

Не нужно создавать собственный тип ActionResult. Так как CSS "просто текст", вы должны быть в порядке, используя ContentResult. Предполагая, что вы унаследовали класс Controller, просто выполните:

return Content(cssData, "text/css");

Ответ 3

В настоящее время я рассматриваю, почему в ASP.NET MVC нет CssResult, и может ли быть причина его отсутствия.

Просто потому, что у команды были свои руки полностью и, очевидно, было несколько попыток добавить ActionResults для всех случаев в жизни.

Создает ли пользовательский ActionResult не лучший способ сделать это?

Это был бы правильный способ сделать это. Я добавил RssActionResult и AtomActionResult для своих нужд. Также разумно добавлять больше типов, для документов, PDF файлов, изображений и т.д.

Возврат CSS, динамически генерируемый методом действия

Также имейте в виду, что браузер обычно кэширует css, если не видит некоторые изменения в URL-адресе. Добавление всегда добавляемого параметра является обычным решением.

<link rel="stylesheet" href="#" onclick="location.href='http://site.com/styles.css?v=26'; return false;">

Возможно, будет работать и дополнительный параметр маршрута для версии.