web-dev-qa-db-ja.com

拡張メソッドは動的にディスパッチできません

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」という名前の適用可能なメソッドはありませんが、その名前による拡張メソッドがあるようです。拡張メソッドを動的にディスパッチすることはできません。拡張メソッド構文を使用せずに、動的引数をキャストするか、拡張メソッドを呼び出すことを検討してください。

エラーを理解できません。何をチェックする必要がありますか?

108
nnmmss

拡張メソッドで動的タイプを使用していますが、これはサポートされていません。

動的型を実際の型にキャストすると、機能します。

私が今見ているものから、私は言うだろう:

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

この問題に対する私の修正は以下を追加することでした:

    @model MyModel

部分コントロールの上部。私はそれを忘れていました。

41
mkaj

MVC拡張メソッドのテーマ(この質問に出くわした方法)を拡張するには、結果をIEnumerable<dynamic>として返すDapperのconnection.Query()構文を使用します。

次の方法で動的オブジェクトを使用することもできます。

  • 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)
    
4
Jason