#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 элементов является излишеством. Вот почему я остановился на этом дизайне.