扩展方法不能动态调度


114

我想在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" })   
}

在控制器中

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”的方法,但似乎具有该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或在不使用扩展方法语法的情况下调用扩展方法。

我无法理解该错误,应该怎么检查?

Answers:


199

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

将动态类型转换为实际类型,它将起作用。

从我现在所看到的,我会说:

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

2
它说不能键入“串”转换为“廉政”
nnmmss

3
@nnmmss,然后ViewBag.MagNo不是int,而是字符串。将其转换为字符串,您应该会很赞
bas 2014年

这个答案并没有真正解决真正的问题-代码可以在其他项目中运行而无需强制转换,或者不在他内部运行-可能缺少一些配置,这会导致编译器感到困惑。-编辑:看起来@mkaj的答案解决了实际问题。
BrainSlugs83

我可以ViewBag.MagNo转换为bool?类型吗?
Dylan Czenski '16

我正在传递一个整数。我最终做了(string)ViewBag.MyNumber.ToString()。仅添加ToString()或(string)会引发异常。是的,我也觉得很奇怪。
SZT

44

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

    @model MyModel

在部分控件的顶部。我忘记了


谢谢,我正在将视图迁移到其他项目,忘了@model了!
rochasdv 2014年

3
如果您使用大写@Model而不是小写模型,也会出现此错误。
蒂莫西·坎斯基

5

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

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

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

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • 将其包装在类中。

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

    然后在您的MVC视图中:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.