Получить ресурс из другого проекта для локальной переменной в представлении ASP.NET С#

Я пытаюсь получить значение ресурса для интернационализации на основе значения переменной foreach.

Мой ресурсный проект называется Resources, я ссылаюсь на него в своем основном проекте.

справочные свойства

Когда я хочу использовать его. используйте только что-то вроде этого: Resources.resourceKey

Проблема

Теперь мне нужно использовать это, но resourceKey находится в переменной в цикле

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => Resources.item.Rating)
        </td>
    </tr>
}

Это, очевидно, не работает, в ресурсах не существует ключа с именем элемента

Мое решение (не работает)

Создайте диспетчер ресурсов и попробуйте получить строку

@{
    System.Reflection.Assembly resourcesAssembly;
    resourcesAssembly = System.Reflection.Assembly.Load("Resources");

    System.Resources.ResourceManager rm = new
       System.Resources.ResourceManager(resourcesAssembly.FullName,
       resourcesAssembly);
}

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => rm.GetString(item.Rating))
        </td>
    </tr>
}

Что я делаю не так??

Действительно спасибо за помощь


person Enrique Barrero Ligero    schedule 14.03.2016    source источник


Ответы (1)


Во-первых - использовать отражение на View - плохой стиль :) Вроде бы все ОК. Вы создаете ResourceManager из другой сборки. Если он создан правильно (просмотр в отладке) и вы можете видеть свои ресурсы в отладке-смотреть - попробуйте проверить свою культуру и что ваш ключ ресурса установлен для этой культуры. ResourceManager выбирает строку ресурса в зависимости от культуры вашего потока. По умолчанию это культура вашей операционной системы.

Из MSDN:

Если пригодный для использования набор локализованных ресурсов не найден, диспетчер ресурсов возвращается к ресурсам культуры по умолчанию. Если диспетчер ресурсов не может загрузить набор ресурсов языка и региональных параметров по умолчанию, метод создает исключение MissingManifestResourceException или, если ожидается, что набор ресурсов будет находиться во вспомогательной сборке, исключение MissingSatelliteAssemblyException. Если диспетчер ресурсов может загрузить соответствующий набор ресурсов, но не может найти ресурс с именем name, метод возвращает значение null. статья MSDN

Итак, если вы не видите исключения - проверьте, указан ли ваш ключ ресурса для выбранной культуры.

person n.prokhorov    schedule 14.03.2016
comment
Ни одно из этих исключений не выдается. Похоже, RM генерируется правильно. В строке Html.DisplayFor(modelItem => rm.GetString(item.Rating)) показать следующее исключение: Исключение типа «System.InvalidOperationException» произошло в System.Web.Mvc.dll, но не было обработано в пользовательском коде. Дополнительная информация: Шаблоны можно использовать только с доступом к полю, доступом к свойству, индекс массива измерений или настраиваемые выражения индексатора с одним параметром. Извините за этот вопрос, может быть, я делаю что-то очень, очень плохое и очевидное, но я новичок в этой технологии =( Thnx - person Enrique Barrero Ligero; 15.03.2016
comment
Ооо, чувак. Вы можете использовать расширение HtmlHelper DisplayFor ТОЛЬКО для свойств/полей модели. rm.GetString(item.Rating) не является свойством или полем. Это метод, который возвращает строковое значение. DisplayFor означает, что вы привязываете некоторую html-разметку к своей модели, чтобы отображать ее значение через Razor. Все расширения DisplayFor, ValidationMessageFor и другие вспомогательные HTML-расширения предназначены для использования с моделями. Если вы хотите отобразить ресурс, просто используйте прямой вывод, например @rm.GetString(item.Rating) - person n.prokhorov; 15.03.2016