2014-02-19 3 views
1

У меня есть модель, которая имеет номера телефонов ICollection. На мой взгляд, я хочу показать значение для записи, помеченной как Primary.Linq и DisplayFor в ASP.Net MVC

@Html.DisplayFor(model => model.Telephones.Where(a=>a.Primary==true).Number) 

.Number не допускается в синтаксисе Linq. Как можно сделать работу над этой линией, а точнее, как правильно отобразить номер?

Я, вероятно, должен сделать логику в контроллере и поместить значение в модель представления, но похоже, что это должно выполняться.

+0

Я чувствую его лучше иметь только для чтения свойства PrimaryNumber, внутри которого вы можете сделать операцию Linq для извлечения номера. Затем привяжите displayfor к этому свойству number. – Thanigainathan

+0

Почему вы так себя чувствуете? –

+0

Я чувствовал себя так, потому что модельная логика должна находиться в слое модели – Thanigainathan

ответ

3

Метод расширения Where возвращает IEnumerable<T>. Если вы просто хотите, первый элемент, который удовлетворяет условию, используйте First:

@Html.DisplayFor(model => model.Telephones.First(a => a.Primary).Number) 

Если вы также должны убедиться, что точно один элемент в набор удовлетворяет условию (и сгенерирует исключение в противном случае), рассмотреть возможность использования Single:

@Html.DisplayFor(model => model.Telephones.Single(a => a.Primary).Number) 
+0

Следует помнить о случае, если номер не найден. Я верю, что в этом случае 'First' возвращает null, что приведет к исключению NullRef. Необходимо справиться с этим делом. – LB2

+0

@ LB2 Вы думаете о 'FirstOrDefault'. 'First' будет вызывать' InvalidOperationException', если он не может найти хотя бы один элемент, который удовлетворяет условию. –

+0

Кроме того, имейте в виду, что если вы используете .Single, вы фактически будете выпускать Top 2 vs First, который делает Top 1. Единственная причина использования Single - это то, что вам нужно исключение, которое будет выбрано, если существует более одного. –

Смежные вопросы