111 votes

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

je veux avoir DropDownListFor en 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 j'ai cette erreur

'System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>' a pas de méthode applicable nommé 'DropDownListFor', mais il semble avoir une méthode d'extension de ce nom. Les méthodes d'Extension ne peut pas être distribué de façon dynamique. Envisagez de convertir la dynamique des arguments ou en appelant la méthode d'extension sans la méthode d'extension de la syntaxe.

Je cann comprends pas l'erreur, ce qui devrait les vérifier?

192voto

bas Points 3878

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

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

43voto

mkaj Points 403

Ma solution à ce problème consistait à ajouter:

     @model MyModel
 

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

5voto

Jason Points 1948

Étendre sur le sujet de la MVC méthodes d'extension (qui est la façon dont j'ai couru à travers cette question), j'aime utiliser Dapper l' connection.Query() de la syntaxe qui permet de renvoyer des résultats d' IEnumerable<dynamic>.

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

  • L'appel de la méthode statique directement, par Jon Skeet la réponse:

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

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

    Puis dans votre MVC Vue:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X