Методы расширения не могут быть отправлены динамически

114

Я хочу иметь DropDownListFor в MVC

@foreach (var item in Model)
{
    @Html.DropDownListFor(modelItem => item.TitleIds, new SelectList(ViewBag.TitleNames as System.Collections.IEnumerable, "TitleId", "Title.TitleText"), "No: " + ViewBag.MagNo, new { id = "TitleIds" })   
}

в контроллере

public ActionResult ArticleList(int id)
{
    ArticleWriter_ViewModel viewModel = new ArticleWriter_ViewModel();
    Func<IQueryable<NumberTitle>, IOrderedQueryable<NumberTitle>> orderByFunc = null;
    Expression<Func<NumberTitle, bool>> filterExpr = null;
    if (id > 0)
    {
        filterExpr = p => p.MagazineId.Equals(id);
    }
    var wholeTitles = unitOfWork.NumberTitleRepository.Get(filterExpr,  orderByFunc, "Magazine,Title").ToList();          

    ViewBag.MagNo = wholeTitles[0].Magazine.MagNo.ToString();
    ViewBag.MagId = wholeTitles[0].Magazine.Id;
    ViewBag.TitleNames = wholeTitles;

    return View("../Panel/Magazine/ArticleList", "_BasicLayout", viewModel);
}

но я получаю эту ошибку

' System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>' не имеет применимого метода с именем ' DropDownListFor', но, похоже, имеет метод расширения с этим именем. Методы расширения не могут быть отправлены динамически. Рассмотрите возможность приведения динамических аргументов или вызова метода расширения без синтаксиса метода расширения.

Я не могу понять ошибку, что я должен проверить?

nnmmss
источник

Ответы:

199

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

Приведите динамические типы к фактическим типам, и это будет работать.

Из того, что я вижу сейчас, я бы сказал:

(string) ViewBag.MagNo

Что приведет к

@foreach (var item in Model)
{
    @Html.DropDownListFor(modelItem => item.TitleIds, 
       new SelectList(ViewBag.TitleNames as System.Collections.IEnumerable, 
       "TitleId", "Title.TitleText"), 
       "No: " + (string) ViewBag.MagNo, 
       new { id = "TitleIds" })   
}
бас
источник
2
он говорит, что невозможно преобразовать тип 'string' в 'int'
nnmmss 05
3
@nnmmss, тогда ViewBag.MagNo - это не int, а строка. Бросьте это на веревку, и вы должны стать золотыми
bas
Этот ответ на самом деле не решает реальную проблему - код работает в других проектах без приведения, только не в его - вероятно, отсутствует какая-то конфигурация, и это приводит к путанице компилятора. - Изменить: похоже, что ответ @mkaj касается реальной проблемы.
BrainSlugs83
Могу ли я привести ViewBag.MagNoк bool?типу?
Дилан Ченски
Я передавал целое число. Что я в итоге сделал (строка) ViewBag.MyNumber.ToString (). Простое добавление ToString () или (string) вызывает исключение. Да, я тоже нашел это странным.
SZT
44

Мое решение этой проблемы заключалось в добавлении:

    @model MyModel

Вверху частичный контроль. Я забыл об этом.

mkaj
источник
Спасибо, я переносил свои взгляды в другой проект и забыл @model, спасибо!
rochasdv 02
3
Вы также получаете эту ошибку, если используете верхний регистр @Model вместо строчной модели.
Тимоти Кански
5

Чтобы расширить тему методов расширения MVC (именно так я столкнулся с этим вопросом), мне нравится использовать connection.Query()синтаксис Dapper, который возвращает результаты в виде файла IEnumerable<dynamic>.

Также можно использовать динамические объекты:

  • Вызов статического метода напрямую, согласно ответу Джона Скита :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • Обертывание в класс.

    public class DynamicQueryResult
    {
        public dynamic QueryResults {get; set;}
    }

    Затем в вашем представлении MVC:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Джейсон
источник