Erweiterungsmethoden können nicht dynamisch versendet werden


114

Ich möchte DropDownListFor in MVC haben

@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" })   
}

im Controller

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);
}

aber ich bekomme diesen Fehler

' System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>' hat keine anwendbare Methode mit dem Namen ' DropDownListFor', scheint aber eine Erweiterungsmethode mit diesem Namen zu haben. Erweiterungsmethoden können nicht dynamisch versendet werden. Ziehen Sie in Betracht, die dynamischen Argumente umzuwandeln oder die Erweiterungsmethode ohne die Syntax der Erweiterungsmethode aufzurufen.

Ich kann den Fehler nicht verstehen. Was soll ich überprüfen?

Antworten:


199

Sie verwenden dynamische Typen in Erweiterungsmethoden, die nicht unterstützt werden.

Wandeln Sie die dynamischen Typen in tatsächliche Typen um, und es wird funktionieren.

Nach dem, was ich jetzt sehe, würde ich sagen:

(string) ViewBag.MagNo

Was dazu führen würde

@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
Es heißt, dass der Typ 'string' nicht in 'int'
konvertiert werden kann

3
@nnmmss dann ViewBag.MagNo ist kein int, sondern ein String. Wirf es auf eine Schnur und du solltest golden sein
bas

Diese Antwort behebt das eigentliche Problem nicht wirklich - der Code funktioniert in anderen Projekten ohne Casting, nur nicht in seinem - wahrscheinlich fehlt eine Konfiguration und der Compiler ist verwirrt. - Bearbeiten: Anscheinend beantwortet die Antwort von @ mkaj das eigentliche Problem.
BrainSlugs83

Kann ich ViewBag.MagNoeinen bool?Typ besetzen?
Dylan Czenski

Ich habe eine ganze Zahl übergeben. Was ich letztendlich gemacht habe (Zeichenfolge) ViewBag.MyNumber.ToString (). Nur das Hinzufügen von ToString () oder (string) löst eine Ausnahme aus. Yah, das fand ich auch komisch.
SZT

44

Meine Lösung für dieses Problem war das Hinzufügen von:

    @model MyModel

Oben auf der Teilkontrolle. Ich hatte es vergessen


Danke, ich habe meine Ansichten auf ein anderes Projekt migriert und das @ -Modell vergessen, danke!
Rochasdv

3
Sie erhalten diesen Fehler auch, wenn Sie @Model in Großbuchstaben anstelle des Modells in Kleinbuchstaben verwenden.
Timothy Kanski

5

Um das Thema der MVC-Erweiterungsmethoden zu erweitern (so bin ich auf diese Frage gestoßen), verwende ich gerne die Dapper- connection.Query()Syntax, die Ergebnisse als zurückgibtIEnumerable<dynamic> .

Es ist auch möglich, dynamische Objekte zu verwenden, indem:

  • Rufen Sie die statische Methode direkt auf, wie Jon Skeet antwortet :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • Wickeln Sie es in eine Klasse.

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

    Dann in Ihrer MVC-Ansicht:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.