web-dev-qa-db-fra.com

Les méthodes d'extension ne peuvent pas être distribuées dynamiquement

Je veux avoir DropDownListFor dans 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" })   
}

dans le contrôleur

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

mais je reçois cette erreur

'System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>> 'n'a pas de méthode applicable nommée' DropDownListFor 'mais semble avoir une méthode d'extension portant ce nom. Les méthodes d'extension ne peuvent pas être distribuées dynamiquement. Envisagez de transtyper les arguments dynamiques ou d’appeler la méthode d’extension sans la syntaxe de la méthode d’extension.

Je ne comprends pas l'erreur, que dois-je vérifier?

108
nnmmss

Vous utilisez des types dynamiques dans les méthodes d'extension, ce qui n'est pas pris en charge.

Convertissez les types dynamiques en types réels, et cela fonctionnera.

D'après ce que je vois maintenant, je dirais:

(string) ViewBag.MagNo

Ce qui aurait pour résultat

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

Ma solution à ce problème consistait à ajouter:

    @model MyModel

Au sommet du contrôle partiel. Je l'avais oublié.

41
mkaj

Pour approfondir le sujet des méthodes d’extension MVC (c’est ainsi que j’ai rencontré cette question), j’aime utiliser la syntaxe connection.Query() de Dapper qui renverra les résultats sous forme de IEnumerable<dynamic>.

Il est également possible d'utiliser des objets dynamiques en:

  • Appel de la méthode statique directement, selon Jon Skeet réponse :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
    
  • Envelopper dans une classe.

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

    Puis dans votre vue MVC:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
    
4
Jason