Как интернационализировать элементы выпадающего списка с помощью Razor

#asp.net-mvc-3 #drop-down-menu

#asp.net-mvc-3 #выпадающее меню

Вопрос:

Мы работаем над веб-сайтом MVC, где в некотором списке есть пользовательские и системные значения. Таким образом, системные элементы должны быть интернационализированы для отображения на пользовательском языке, а пользовательские элементы уже находятся на пользовательском языке.

Эти системные элементы имеют флаг с именем « IsSystem «, чтобы отличать те, которые нам нужно интернационализировать. Этот флаг также означает, что пользователь не может обновлять или удалять эти элементы.

Что ж, мы используем @Html.DropDownList для рендеринга этот выпадающий список… поэтому я не нахожу, как вмешаться в логику загрузки выпадающего списка … чтобы поместить if оператор, проверяющий наличие IsSystem флага и получающий правильный текст из файлов ресурсов.

Спасибо за любую идею о том, как с этим справиться…

Редактировать:

Код контроллера:

ViewBag.idTaskType = new SelectList(db.TaskTypes, "idTaskType", "Name");

где db находится контекст из EntityFramework

Просмотр Кода:

 @Html.DropDownList("idTaskType", String.Empty)
 

Комментарии:

1. Пожалуйста, опубликуйте код, в котором вы заполняете данные выпадающего списка.

Ответ №1:

Я представляю ваши таблицы «TaskTypes», как показано ниже

 idTaskType  Name
----------  -----
1           Task1
2           Task2
3           Task3
 

Давайте рассмотрим два разных «App_GlobalResources»

[1]ru-US

 Name    Value
----    -----
Task1   Create  
Task2   Update
Task3   Delete
 

[1] sv

 Name    Value
----    -----
Task1   Skapa
Task2   Uppdatera
Task3   Ta bort
 

Теперь разработайте IEnumerable SelectListItem

 public IEnumerable<SelectListItem> TaskTypeList { 
        get{
            List<TaskTypes> List = db.TaskTypes.ToList();
            return List.Distinct().OrderBy(x => x.Name).Select(x => new SelectListItem
                    {
                        Value = x.idTaskType.ToString(), 
                        Text = (HttpContext.GetGlobalResourceObject("Task", x.Name)).ToString()
                    });
        } 
    }
 

Наконец, используйте

 @Html.DropDownList("idTaskType", new SelectList(Model.TaskTypeList, "Value", "Text"), String.Empty)
 

Спасибо.

Ответ №2:

Вам потребуется иметь интернационализированные версии ваших данных. Итак, вы могли бы сделать что-то вроде этого:

 ViewBag.idTaskType = new SelectList(db.TaskTypes
   .Where(x => x.language == "en"), "idTaskType", "Name");
 

Комментарии:

1. Это не мой текущий сценарий … поскольку мне нужно перевести только те типы задач, которые имеют флаг IsSystem в true … другие значения должны оставаться при вводе пользователем. Но я думаю, что мне следует добавить в него немного логики LINQ.

2. @Romias — Я не понимаю, что ты имеешь в виду. Просто добавьте проверку isSystem в запрос linq.

3. У меня нет перевода в базе данных… в таблице TaskType есть только «Name» и «IsSystem». Когда тип задачи принадлежит пользователю, имя должно оставаться неизменным… но если TaskType является сборным (принадлежащим системе), свойство Name необходимо заменить переводом, который берется из файлов ресурсов.

4. @Romias — Глупо помещать один перевод в базу данных, а другой — в файл ресурсов. Обычно файлы ресурсов хранят свои строки с идентификаторами, поэтому вам понадобится какой-то способ сопоставить исходную строку с идентификатором, затем найти ее в файле ресурсов, а затем добавить их в список выбора. Это действительно плохой дизайн, когда часть ваших данных извлекается из базы данных, а часть — из файла ресурсов.

5. Это зависит … в эту таблицу будет встроено 5-10 элементов (помеченных как IsSystem)… остальные сотни элементов будут представлять собой пользовательские данные без необходимости перевода. Таким образом, добавление столбцов в таблицу БД для обработки перевода 10 элементов является излишеством. Вот почему я остановился на этом дизайне.