C# 无法动态调度扩展方法

C# 无法动态调度扩展方法,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我想在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 = "T

我想在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);
}
public ActionResult文章列表(int-id)
{
ArticleWriter_ViewModel ViewModel=新建ArticleWriter_ViewModel();
Func orderByFunc=null;
表达式filterExpr=null;
如果(id>0)
{
filterExpr=p=>p.MagazineId.Equals(id);
}
var wholeTitles=unitOfWork.NumberTitleRepository.Get(filterExpr,orderByFunc,“杂志,标题”).ToList();
ViewBag.MagNo=wholeTitles[0]。Magazine.MagNo.ToString();
ViewBag.MagId=wholeTitles[0].Magazine.Id;
ViewBag.TitleNames=wholeTitles;
返回视图(“../Panel/Magazine/ArticleList”,“\u BasicLayout”,viewModel);
}
但是我得到了这个错误

System.Web.Mvc.HtmlHelper
”没有名为“
DropDownListFor
”的适用方法,但似乎具有该名称的扩展方法。无法动态调度扩展方法。考虑在不使用扩展方法语法的情况下强制转换动态参数或调用扩展方法。
我无法理解错误,我应该检查什么?

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

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

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

(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
的形式返回结果

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

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

    然后在MVC视图中:

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

它说无法将类型“string”转换为“int”@nnmmss,那么ViewBag.MagNo不是int,而是字符串。将其转换为字符串,您应该知道Goldenth这个答案并没有真正解决真正的问题——代码可以在其他项目中工作而不进行转换,只是不在his中——可能缺少一些配置,这会导致编译器混淆。-编辑:看起来@mkaj的答案解决了实际问题。我可以将
ViewBag.MagNo
转换为
bool吗?
类型吗?我传递了一个整数。我最后做的是(字符串)ViewBag.MyNumber.ToString()。只需添加ToString()或(string)就会引发异常。是的,我也觉得很奇怪。谢谢,我正在将我的视图迁移到其他项目,但我忘记了@model,thks!如果使用大写@Model而不是小写Model,也会出现此错误。
public class DynamicQueryResult
{
    public dynamic QueryResults {get; set;}
}
@model Namespace.DynamicQueryResult

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