I metodi di estensione non possono essere inviati dinamicamente


114

Voglio avere DropDownListFor in 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" })   
}

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

ma ottengo questo errore

" System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>" non ha un metodo applicabile denominato " DropDownListFor" ma sembra avere un metodo di estensione con quel nome. I metodi di estensione non possono essere inviati dinamicamente. Considerare la possibilità di eseguire il cast degli argomenti dinamici o di chiamare il metodo di estensione senza la sintassi del metodo di estensione.

Non riesco a capire l'errore, cosa dovrei controllare?

Risposte:


199

Stai utilizzando tipi dinamici nei metodi di estensione, che non sono supportati.

Trasmetti i tipi dinamici ai tipi effettivi e funzionerà.

Da quello che vedo ora, direi:

(string) ViewBag.MagNo

Il che risulterebbe

@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
dice Impossibile convertire il tipo "stringa" in "int"
— nnmmss

3
@nnmmss quindi ViewBag.MagNo non è un int, ma una stringa. Lancialo su una corda e dovresti essere d'oro
— bas

Questa risposta in realtà non risolve il vero problema - il codice funziona in altri progetti senza casting, ma non nel suo - probabilmente manca qualche configurazione e sta causando confusione nel compilatore. - Modifica: sembra che la risposta di @ mkaj risolva il problema reale.
— BrainSlugs83

Posso trasmettere ViewBag.MagNoa un bool?tipo?
— Dylan Czenski

Stavo passando un numero intero. Quello che ho finito per fare (stringa) ViewBag.MyNumber.ToString (). La semplice aggiunta di ToString () o (stringa) genera un'eccezione. Sì, l'ho trovato strano anche io.
— SZT

44

La mia soluzione per questo problema è stata aggiungere:

    @model MyModel

Nella parte superiore del controllo parziale. L'avevo dimenticato.


Grazie, stavo migrando le mie visualizzazioni su un altro progetto e ho dimenticato il @model, grazie!
— rochasdv

3
Ottieni questo errore anche se usi @Model maiuscolo invece del modello minuscolo.
— Timothy Kanski

5

Per espandere l'argomento dei metodi di estensione MVC (che è il modo in cui mi sono imbattuto in questa domanda), mi piace usare la connection.Query()sintassi di Dapper che restituirà risultati come file IEnumerable<dynamic>.

È anche possibile utilizzare oggetti dinamici:

  • Chiamando direttamente il metodo statico, secondo la risposta di Jon Skeet :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • Avvolgendolo in una classe.

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

    Quindi nella tua vista MVC:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.