2014-01-05 63 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)