Я просто задаюсь вопросом, где люди создают свой SelectList - в действии или представлении.
Я видел примеры обоих и того, который имеет большую часть смысла мне, делает его в действии, и имейте модель представления, имеют свойство типа SelectList.
С другой стороны, я видел примеры, где у людей есть модель представления, имеют свойство SelectList, и SelectList заполняется в рамках модели представления (или в конструкторе или через ленивую загрузку). Мне нравится эта идея, поскольку это означает, что в моих действиях существует меньше кода...
Короче говоря я просто задавался вопросом, какие люди делают банкомат.
Аплодисменты Anthony
Я использовал метод расширения, который проверяет две последовательности для равных предметов
public static bool CheckForEquality<T>(this IEnumerable<T> source, IEnumerable<T> destination)
{
if (source.Count() != destination.Count())
{
return false;
}
var dictionary = new Dictionary<T, int>();
foreach (var value in source)
{
if (!dictionary.ContainsKey(value))
{
dictionary[value] = 1;
}
else
{
dictionary[value]++;
}
}
foreach (var member in destination)
{
if (!dictionary.ContainsKey(member))
{
return false;
}
dictionary[member]--;
}
foreach (var kvp in dictionary)
{
if (kvp.Value != 0)
{
return false;
}
}
return true;
}
-121 -1717492- Главный вопрос: какова цель поля dateime/timestamp? Если это всего лишь временная метка, как в файле журнала, где сохраняется только фактическое время, то временная метка является лучшим выбором. Потому что ему нужно всего 4 байта, и мы находимся в области, которую может покрыть метка времени. Если это дата, как дата рождения, дата и время являются хорошим выбором. Мы надеемся, что у нас будет решение до окончания срока действия временной метки.;) (Извините за мой английский).
-121--4407417-Создайте в контроллере (путем просмотра списка предметов из репозитория модели) и передайте его в представление как объект ViewData или как часть сильно типизированной ViewModel.
Это аспект, связанный с презентацией, поэтому я предпочитаю делать это в представлении, используя помощник Html. Поэтому я передаю коллекцию в представление и использую вспомогательный метод html для сопоставления элементов с SelectListItems. Метод может выглядеть примерно так:
public static IList<SelectListItem> MapToSelectItems<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected)
{
var result = new List<SelectListItem>();
foreach (var item in itemsToMap)
{
result.Add(new SelectListItem
{
Value = valueProperty(item),
Text = textProperty(item),
Selected = isSelected(item)
});
}
return result;
}
С уважением.
У меня есть SelectList, представленный как свойство в модели представления, и я заполняю его в действии, используя необходимый репозиторий. Я думаю, что код, который напрямую взаимодействует с репозиториями, должен быть тем, который также отвечает за заполнение, будь то действия контроллера, уровень сервиса или что-то еще.
Я не думаю, что заполнение списка непосредственно из модели представления является хорошей идеей, потому что для этого потребуется, чтобы модель представления имела зависимость от репозитория и взаимодействовала с базой данных, а модель представления не должна нести ответственность за такого рода вещи.
Вы также можете создать отдельный специальный объект, называемый Initializer или что-то в этом роде, который выполняет все заполнение и инициализацию, если у вас есть несколько полей SelectList и вы хотите, чтобы код ваших действий был более чистым.
Обычно я создаю свой список SelectList в действии или уровень обслуживания и передать его моему представлению через ViewData. Я также сделал его частью модели представления и строго типизированного представления. Однако оба способа создают его на уровне действия или сервиса.
Ни то, ни другое, создайте его в отдельном классе, смотрите здесь Как отобразить модель представления обратно в модель домена в действии POST?
I используйте интерфейс IBuilder в контроллере и выполняйте все построение сущностей / моделей представления в реализации этого Builder