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


114

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

エラーを理解できません。何を確認すればよいですか?

回答:


199

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

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

私が今見ているものから、私は言うでしょう:

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

2
型 'string'を 'int'に変換できません
nnmmss

3
@nnmmssの場合、ViewBag.MagNoはintではなく文字列です。それを文字列にキャストして、あなたは黄金色でなければなりません
BAS

この答えは実際の問題には実際には対応していません-コードはキャストすることなく他のプロジェクトで機能しますが、彼ではありません-いくつかの設定が欠落しており、コンパイラーを混乱させています。-編集:@mkajの回答が実際の問題に対処しているようです。
BrainSlugs83 2016年

私はキャストすることができますViewBag.MagNobool?タイプ?
Dylan Czenski 2016年

整数を渡していました。最終的に(string)ViewBag.MyNumber.ToString()を実行した結果。ToString()または(String)を追加するだけで例外がスローされます。ああ、それも変だと思った。
SZT 2017年

44

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

    @model MyModel

部分的なコントロールの上部。忘れていました。


おかげで、私は自分の見解を他のプロジェクトに移行していました。
rochasdv 2014年

3
小文字のモデルではなく大文字の@Modelを使用した場合にも、このエラーが発生します。
Timothy Kanski、2016年

5

MVC拡張メソッド(この質問に遭遇した方法です)の主題を拡張するために、connection.Query()結果をとして返すDapperの構文を使用したいと思いますIEnumerable<dynamic>

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

  • Jon Skeetの答えに従って、静的メソッドを直接呼び出す:

    @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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.