Я пытался быть остроумным и использовать VirtualPathProvider для поиска локализованных представлений. Он берет запрошенный путь просмотра и изменяет его при проверке после файла. Возвращает локализованный виртуальный файл, если найден:
public pseudoclass MyFileProvider : VirtualPathProvider
{
bool FileExists(string requestedPath)
{
if (IsLocalizedView(requestedPath))
return true;
return base.FileExists(requestedPath);
}
bool IsLocalizedView(string requestedPath)
{
var uri = requestedUri.AddLocaleByMagic("sv");
if (FileExistsInternal(uri))
return true;
}
//some more stuff to return the actual file
}
Проблема в том, что я получаю следующее исключение:
VirtualPathProvider возвратил объект VirtualFile с VirtualPath, установленным в '/Views/Shared/_Layout.sv.cshtml' вместо ожидаемого '/Views/Shared/_Layout.cshtml'.
.
Конечно, я мог бы подделать путь к файлу, но это вызвало бы проблемы с кэшированием и различными локализациями. Правильно?
Кто-нибудь получил лучший способ иметь возможность создавать локализованные представления? Я не хочу использовать то же самое представление, но со строками ресурса вместо этого. Такие взгляды настолько ужасны, что почти заставляют меня плакать, потому что их так трудно читать.
Если вы все еще не поняли, что я ищу:
/ Views / Пользователь / Details.sv.cshtml
Hejsan @Model.FirstName
Detta är en lite rolig text på svenska.
/ Views / Пользователь / Details.en.cshtml
Hello @Model.FirstName
This is a test on english.
Контроллер
public ActionResult Details()
{
return View(new User()); //should automagically use a swedish or english view
}
Я хочу иметь возможность переключать представления (на локализованные с использованием CurrentCulture) без необходимости что-либо делать вручную при каждом запросе.