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.