Почему работает lamba-выражение, но при непосредственном доступе к объекту Model это не так? - PullRequest
1 голос
/ 26 августа 2010

Вот ошибка, которую я получаю:

Описание: Произошла ошибка во время компиляции ресурса, необходимого для обслуживания этого запроса.Просмотрите следующие конкретные сведения об ошибке и измените исходный код соответствующим образом.

Сообщение об ошибке компилятора: CS0411: аргументы типа для метода 'System.Web.Mvc.Html.SelectExtensions.DropDownListFor (System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>, System.Collections.Generic.IEnumerable) 'не может быть выведен из использования.Попробуйте явно указать аргументы типа.

<div class="editor-field">
    <%: Html.DropDownListFor(model => model.Country, ViewData["Countries"] as SelectList) %>
    <%: Html.DropDownListFor(Model.Country, ViewData["Countries"] as SelectList) %>
    <%: Html.ValidationMessageFor(model => model.Country) %>
</div>

Первый DropDownListFor отлично работает;второй дает мне исключение.Мне любопытно, почему это вызвано.Если я введу «Модель» напрямую, я все равно получу список ее атрибутов.Почему этот перерыв?

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 26 августа 2010

DropDownListFor ожидает лямбда-выражение (на самом деле Expression<Func<TModel, TProperty>>). Model.Country не является ни выражением, ни функцией, поэтому она не будет работать там.

Проверка MSDN Выбрать расширения. DropDownListFor

0 голосов
/ 07 ноября 2011

В очень похожей заметке у меня была эта проблема с MVC3 / Razor, потому что я просматривал коллекцию модели в HTML. Я пытался использовать переменную цикла, и я получил эту ошибку. В моем случае решением было вернуться к модели, используя переменную цикла в моем запросе LINQ.

Мой цикл:

@foreach (BookField bookField in Model.BookFields)

Изменен первый параметр в @ Html.DropDownListFor с ...

bookField

Для того, чтобы ...

model => model.BookFields.First(q => q.BookFieldId == bookField.Id).Value

Полное утверждение теперь выглядит так:

@Html.DropDownListFor(model => model.BookFields.First(q => q.BookFieldID == bookField.Id).Value, new SelectList(ViewData[ddlKey] as Dictionary<string, string>, "Key", "Value", bookField.Value), "[select]")

Обратите внимание, я произвольно переименовал некоторые вещи для этого примера, так что это может не иметь большого логического смысла; Я просто надеюсь, что это имеет достаточно синтаксического смысла, чтобы помочь кому-либо еще с этой же проблемой:)

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

Это связано с сигнатурой метода вспомогательного метода.Это для общей динамической оценки объекта.

Вы можете написать свою собственную перегрузку помощнику, который принимает только ту функцию, которую вы хотите.

...