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?
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" })
}
Ma solution à ce problème consistait à ajouter:
@model MyModel
Au sommet du contrôle partiel. Je l'avais oublié.
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)