Как использовать скомпилированные глобальные ресурсы в 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 и т.д. Остается пустым. Простое решение - переименовать файлы.