不能动态调度扩展方法

我想在 MVC 中使用 DropDownListFor

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

但我得到了这个错误

System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>”没有名为“ DropDownListFor”的适用方法,但似乎有一个名为“ DropDownListFor”的扩展方法。不能动态调度扩展方法。考虑强制转换动态参数或在不使用扩展方法语法的情况下调用扩展方法。

我不能理解这个错误,我应该检查什么?

66037 次浏览

您正在扩展方法中使用动态类型,这是不受支持的。

将动态类型转换为实际类型,这样就可以工作了。

From what I see now, I'd say:

(string) ViewBag.MagNo

这会导致

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

我对这个问题的解决方法是:

    @model MyModel

在部分控制的顶部,我忘了。

为了扩展 MVC 扩展方法这个主题(我就是这样遇到这个问题的) ,我喜欢使用 Dapper 的 connection.Query()语法,它将以 IEnumerable<dynamic>的形式返回结果。

还可以通过以下方式使用动态对象:

  • 根据 Jon Skeet 的 回答,直接调用静态方法:

    @model IEnumerable<dynamic>
    
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
    
  • Wrapping it in a class.

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

    然后在你的 MVC 视图中:

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