Методи розширення не можна динамічно розсилати


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', але, схоже, має метод розширення за цим іменем. Методи розширення не можна динамічно розсилати. Розгляньте можливість введення динамічних аргументів або виклику методу розширення без синтаксису методу розширення.

Я не можу зрозуміти помилку, що мені слід перевірити?

Відповіді:


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

3
@nnmmss, то ViewBag.MagNo - це не int, а рядок. Кинь його на струну, і ти повинен бути золотим
bas

Ця відповідь насправді не вирішує справжню проблему - код працює в інших проектах без кастингу, просто не в його - ймовірно, якась конфігурація відсутня, і компілятор збиває з пантелику. - Редагувати: Схоже, відповідь @ mkaj вирішує фактичну проблему.
BrainSlugs83

Чи можу я ViewBag.MagNoпризначити bool?тип?
Ділан Ченскі

Я проходив ціле число. Що я закінчив робити (рядок) ViewBag.MyNumber.ToString (). Просто додавання ToString () або (string) кидає виняток. Так, я теж це дивно вважав.
SZT

44

Моє виправлення цієї проблеми було додати:

    @model MyModel

У верхній частині часткового контролю. Я це забув.


Дякую, я мігрував свої погляди на інший проект, і я забув @model, thks!
rochasdv

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 View:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.