【问题标题】:Extension methods cannot be dynamically dispatched扩展方法不能动态调度
【发布时间】:2014-01-05 10:47:00
【问题描述】:

我想在 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&lt;System.Collections.Generic.IEnumerable&lt;Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel&gt;&gt;”没有名为“DropDownListFor”的适用方法,但似乎有一个使用该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或调用扩展方法而不使用扩展方法语法。

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3


    【解决方案1】:

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

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

    从我现在看到的情况来看,我会说:

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

    【讨论】:

    • 它说Cannot convert type 'string' to 'int'
    • @nnmmss 那么 ViewBag.MagNo 不是一个整数,而是一个字符串。把它扔到一根绳子上,你应该是金色的
    • 这个答案并没有真正解决真正的问题——代码在其他项目中没有强制转换,只是在他的项目中没有——可能缺少一些配置,导致编译器混淆。 -- 编辑:看起来@mkaj 的回答解决了实际问题。
    • 我可以将ViewBag.MagNo 转换为bool? 类型吗?
    • 我传递了一个整数。我最终做了什么(字符串)ViewBag.MyNumber.ToString()。只需添加 ToString() 或 (string) 就会引发异常。是的,我也觉得这很奇怪。
    【解决方案2】:

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

        @model MyModel
    

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

    【讨论】:

    • 谢谢,我正在将我的视图迁移到其他项目,但我忘记了@model,谢谢!
    • 如果你使用大写的@Model而不是小写的model,你也会得到这个错误。
    【解决方案3】:

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

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

    • 根据 Jon Skeet 的 answer 直接调用静态方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多