Как использовать скомпилированные глобальные ресурсы в ASP.NET MVC

Я хочу скомпилировать App_GlobalResources/Strings.resx в свою сборку (и, в конечном итоге, использовать сборки для Strings.es.res.resx, Strings.fr.resx и т.д.), но следующая ошибка возникает после публикации приложения:

"Не удалось загрузить файл или сборку" App_GlobalResources "или одну из его зависимостей. Система не может найти указанный файл."

Шаги по воспроизведению:

  • Создайте новый проект ASP.NET MVC.
  • Добавьте папку App_GlobalResources и файл Strings.resx.
  • Задайте действие для сборки файла
  • Добавьте строку в Strings.resx и используйте ее в HomeController.Index(), например. ViewData["Message"] = Strings.MyTest
  • F5 для отладки, отлично работает.
  • Опубликовать в IIS и (поскольку Strings.resx исключен из публикации), вы получите вышеуказанную ошибку на опубликованном сайте.

Могут ли проекты ASP.NET MVC использовать строковые ресурсы, скомпилированные в dll, и если да, то что я делаю неправильно?


Обновление: вот что я вижу в Reflector: String Resources

Итак, почему ResourceManager не находит их? Не полагается ли откат к основной сборке по умолчанию?

Ответы

Ответ 1

Здесь хорошая стартовая точка http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx

Я настраиваю проект так же, как вы упомянули, и получил ту же ошибку при развертывании в IIS6. Изменение Custom Tool до PublicResXFileCodeGenerator и Custom Tool Namespace до Resources для предложений Скотта очистило его.

Я также следовал примеру Скотта в отношении устранения App_GlobalResources, но я получил его, чтобы он работал нормально. Это может быть вопросом личных предпочтений.

Ответ 2

Вероятно, есть еще одна вещь, которая должна знать о PublicResXFileCodeGenerator - она ​​не работает с файлами с более чем одной точкой в ​​имени файла (см. http://social.msdn.microsoft.com/Forums/ru-RU/9412f049-acd8-4a77-b73a-f3810df18376/naming-resources-files-issue-aspnet-mvc-3?forum=dlr). Таким образом, codebehind для Strings.es.resx, Strings.fr.resx и т.д. Остается пустым. Простое решение - переименовать файлы.