Разница между этими двумя способами локализации строки в файле 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. В начале жизненного цикла страницы / элемента управления.
Другие вопросы по тегам