ASP.NET MVC 2 / .NET 4 / Razor - невозможно использовать метод расширения Any () для члена ViewModel - PullRequest
4 голосов
/ 21 августа 2010

Я испытываю Razor ViewEngine из ASP.NET MVC 3 Preview 1 и сталкиваюсь с проблемой, пытающейся использовать метод расширения Any().

Вот код, который я использую для установки свойства в контроллере:

ViewModel.Comparisons = DB.Comparisons.Where(c => c.UserID == this.UserID).ToArray();

Вот код в представлении, где я пытаюсь использовать Any():

@if (!View.Comparisons.Any()) {
<tr>
    <td>You haven't not started any comparisons yet. @Html.Action("Start a new comparison?", "create", "compare")</td>
</tr>
}

Я получаю исключение, которое говорит:

'System.Array' does not contain a definition for 'Any'

Я попытался добавить пространство имен System.Linq в раздел pages\namespaces файла web.config и добавить строку @using System.Linq в верхней части представления, но ни одно из них не имело значения. Что мне нужно сделать, чтобы получить доступ к методам расширения LINQ?

Обновление: Похоже, это связано с тем, что это свойство динамического объекта - оно работает, если я вручную приведу его к IList<T>.

Ответы [ 2 ]

8 голосов
/ 25 августа 2010

К сожалению, вы не можете вызывать методы расширения для значений, которые объявлены как динамические. В этом случае ViewModel возвращает динамические значения, поэтому компилятор не знает тип, поэтому невозможно найти вызовы методов расширения.

Я рекомендую одно из следующего:

  1. Используйте строго типизированное представление. Таким образом, вы также получите полную версию Intellisense в Visual Studio, как только это будет поддержано.

  2. Приведите значения к явному IList и затем вызовите метод расширения. Таким образом, компилятор может сделать правильное отображение.

0 голосов
/ 22 августа 2010

Кажется, это ошибка со свойством динамического просмотра. Если вы измените свое заявление @if на что-то вроде

@if(!(new List<string>().Any())) { }

Вы увидите, что это работает.

...