Metode ekstensi tidak dapat dikirim secara dinamis


114

Saya ingin memiliki DropDownListFor di 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" })   
}

di Controller

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);
}

tapi saya mendapatkan kesalahan ini

' System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>' tidak memiliki metode yang berlaku bernama ' DropDownListFor' tetapi tampaknya memiliki metode ekstensi dengan nama itu. Metode ekstensi tidak dapat dikirim secara dinamis. Pertimbangkan untuk mentransmisikan argumen dinamis atau memanggil metode ekstensi tanpa sintaks metode ekstensi.

Saya tidak mengerti kesalahannya, apa yang harus saya periksa?

Jawaban:


199

Anda menggunakan jenis dinamis dalam metode ekstensi, yang tidak didukung.

Transmisikan tipe dinamis ke tipe aktual, dan ini akan berfungsi.

Dari apa yang saya lihat sekarang, saya akan mengatakan:

(string) ViewBag.MagNo

Yang akan menghasilkan

@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
dikatakan Tidak dapat mengubah jenis 'string' menjadi 'int'
nnmmss

3
@nnmmss lalu ViewBag.MagNo bukan int, tapi string. Lemparkan ke seutas tali dan Anda akan menjadi emas
bas

Jawaban ini tidak benar-benar mengatasi masalah sebenarnya - kode tersebut berfungsi di proyek lain tanpa casting, hanya saja tidak dalam miliknya - kemungkinan ada beberapa konfigurasi yang hilang dan itu menyebabkan kompiler menjadi bingung. - Edit: Sepertinya jawaban @ mkaj membahas masalah sebenarnya.
BrainSlugs83

Bisakah saya mentransmisikan ViewBag.MagNoke suatu bool?tipe?
Dylan Czenski

Saya melewati integer. Apa yang akhirnya saya lakukan (string) ViewBag.MyNumber.ToString (). Hanya menambahkan ToString () atau (string) akan melempar pengecualian. Yah, menurutku itu aneh juga.
SZT

44

Perbaikan saya untuk masalah ini adalah menambahkan:

    @model MyModel

Di bagian atas kontrol parsial. Saya telah melupakannya.


Terima kasih, saya memindahkan pandangan saya ke proyek lain dan saya lupa @model, terima kasih!
rochasdv

3
Anda juga mendapatkan kesalahan ini jika Anda menggunakan @Model huruf besar daripada model huruf kecil.
Timothy Kanski

5

Untuk memperluas subjek metode ekstensi MVC (begitulah cara saya menemukan pertanyaan ini), saya suka menggunakan connection.Query()sintaks Dapper yang akan mengembalikan hasil sebagai file IEnumerable<dynamic>.

Dimungkinkan juga untuk menggunakan objek dinamis dengan:

  • Memanggil metode statis secara langsung, sesuai jawaban Jon Skeet :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • Membungkusnya di kelas.

    public class DynamicQueryResult
    {
        public dynamic QueryResults {get; set;}
    }

    Kemudian di MVC View Anda:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.