2014-01-05 4 views
89

Я хочу иметь 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>>' не имеет применимый метод named 'DropDownListFor', но по этому имени имеет метод расширения. Методы расширения не могут динамически отправляться. Рассмотрите возможность использования динамических аргументов или вызова метода расширения без синтаксиса метода расширения.

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

ответ

160

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

Включение динамических типов в реальные типы, и это сработает.

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

(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" }) 
} 
+0

он говорит, что не удается преобразовать 'строка' типа для 'межд' – nnmmss

+3

@nnmmss тогда ViewBag.MagNo не является INT, но строка. Передайте его в строку, и вы должны быть золотыми. – bas

+0

. Этот ответ действительно не затрагивает реальную проблему - код работает в других проектах без кастинга, просто не в его - вероятно, какая-то конфигурация отсутствует, и это приводит к тому, что компилятор путайте. - Редактировать: Похоже, ответ @ mkaj отвечает на фактическую проблему. – BrainSlugs83

35

Мой исправления для этой проблемы было добавить:

@model MyModel 

В верх части частичного управления. Я забыл об этом.

+0

Спасибо, я переносил свои взгляды в другой проект, и я забыл @model, thks! – rochasdv

+3

Вы также получите эту ошибку, если используете вместо прописных букв в верхнем регистре @Model. –

4

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

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

  • Вызов статического метода непосредственно на Jon Скита answer:

    @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) 
    
Смежные вопросы