Разница между этими двумя способами локализации строки в файле aspx/ascx?
Когда я начал локализовать сайт в первый раз, я просто сделал локализацию следующим образом:
<%= Resources.ResourceFile.ResourceName %>
и, кажется, работает отлично. Тем не менее, ReSharper 5.0 Beta делает это так:
<asp:Localize Text="<%$ Resources: ResourceFile, ResourceName %>" runat="server">
Value
</asp:Localize>
Имеет ли значение, каким образом это будет сделано?
Кроме того, почему ReSharper хранит исходный текст внутри элемента управления localize? Я думал, что это было в случае, если значение внутри файла ресурсов было пустым, он мог показать текст "по умолчанию". Это не похоже на случай. Безопасно ли удалять его и просто самостоятельно закрывать локализацию?
4 ответа
Ну, вы не можете использовать тег сервера <% =%> на элементе управления asp-сервером.
так
<asp:Localize Text="<%= Resources.ResourceFile.ResourceName %>" runat="server">
Value
</asp:Localize>
приведет к ошибке компиляции. К сожалению, вы не можете передавать динамические данные в свойства серверного элемента управления, если это не связано с данными, где вы можете применить <%# %>
тег сервера, например:
<asp:Repeater runat="server">
...
<asp:Localize Text="<%# Resources.ResourceFile.ResourceName %>" runat="server">
Value
</asp:Localize>
...
</asp:Repeater>
Вы всегда можете переместить это в код, но это отстой.
<%$ %>
"вещь" работает, однако, если вы идете по ней, готовьтесь войти в ад обслуживания (если, конечно, мы не говорим о 3-страничном приложении...)
Лично я использую <%= %>
и я никогда не использую повторную резкость для глобализации / локализации моих приложений. Кроме того, я никогда не использовал <asp:Localize />
управление сервером и у меня не было проблем...
Следующая информация, которую я нашел на MSDN, которая может помочь вам понять разницу, которую вы хотите
Для извлечения глобальных ресурсов с использованием строгой типизации
Resources.ResourceFile.ResourceName используется to retrieve global resources using strong typing
Ресурсы компилируются в пространство имен Resources, и каждый ресурс по умолчанию становится членом класса Resources. Например, если вы создали файл ресурсов по умолчанию WebResources.resx, и этот файл содержит ресурс с именем WelcomeText, вы можете ссылаться на ресурс в коде, как показано в следующем коде
Строка приветствуется; welcome = Resources.WebResources.WelcomeText;
для получения более подробной информации: http://msdn.microsoft.com/en-us/library/ms227982.aspx
Явная локализация
<asp:Button ID="Button1" runat="server"
Text="<%$ Resources:WebResources, Button1
Подпись%>
Выражение ресурса принимает следующую форму, где Class является необязательным, если только ресурс не является глобальным и ResourceID не требуется:
Значение Class определяет файл ресурса, который будет использоваться при использовании глобальных ресурсов. Когда файлы.resx компилируются, базовое имя файла без расширений явно используется в качестве имени класса получающейся сборки. Если вы хотите использовать ресурсы из локального файла ресурсов (который соответствует имени текущей страницы), вам не нужно включать имя класса. Это связано с тем, что ASP.NET сопоставляет класс страницы с классом ресурса.
Значение ResourceID - это идентификатор ресурса для чтения. В предыдущем примере свойство Text для кнопки считывается из файла глобальных ресурсов WebResources.resx (или соответствующей локализованной версии). В этом файле ASP.NET использует значение для ресурса с идентификатором Button1Caption и для самой страницы. Чтобы установить свойства страницы, вы можете использовать выражения ресурса в директиве @ Page
Подробнее об этом: http://msdn.microsoft.com/en-us/library/ms227427(v=VS.100).aspx
Первый. Создайте отдельную foreach-страницу (модуль) для файла Rsource, а второй - "Создайте один (или заново)" и вставьте на нее все ключи ресурсов.
Второй подход позволяет вам легко создавать новые языки для вашего приложения, потому что все строки собраны в одном месте, и вы можете отдать их кому угодно для перевода.
afaik есть разница, и это вопрос времени.
Я не подтвердил это, но я действительно ожидал, что <% $ произойдет намного раньше в жизненном цикле страницы.
- <% = это в значительной степени <% Response.Write ("Some Text")%>, поэтому вы не можете использовать его во многих местах в aspx, т.е. это нужно сделать, когда страница отображается
- <% # происходит во время DataBind /, что далеко от инициализации страницы / элемента управления. Обратите внимание, что код DataBind может использовать другие свойства, которые установлены ранее, поэтому это важное отличие.
- Учитывая вышесказанное и то, что вы можете использовать <% $ в свойствах элемента управления, я действительно ожидаю, что это произойдет v. В начале жизненного цикла страницы / элемента управления.