2014-01-05 23 views
89

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

在控制器

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',但似乎有一个名称的扩展方法。扩展方法不能动态分派。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。

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

回答

160

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

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

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

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

它说无法转换类型 '字符串' 到 '廉政' – nnmmss

+3

@nnmmss然后ViewBag.MagNo不是一个整数,而是一个字符串。把它转换成字符串,你应该是金色的 – bas

+0

这个答案并没有真正解决真正的问题 - 代码在其他项目中没有投射,只是不在他的 - 可能有一些配置丢失,并导致编译器感到困惑。 - 编辑:看起来像@ mkaj的回答解决了实际问题。 – BrainSlugs83

35

我对这个问题的修复是添加:

@model MyModel 

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

+0

谢谢,我正在将我的观点转移到其他项目,并且我忘了@model,谢谢! – rochasdv

+3

如果您使用大写@Model代替小写模型,您也会遇到此错误。 –

4

为了扩展MVC扩展方法的主题(我是如何运行这个问题的),我喜欢使用Dapper的connection.Query()语法,它将返回结果作为IEnumerable<dynamic>

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

  • 直接调用静态方法,每乔恩斯基特的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)