Uzantı yöntemleri dinamik olarak gönderilemez


114

MVC'de DropDownListFor'a sahip olmak istiyorum

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

Denetleyicide

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

ama bu hatayı alıyorum

" System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>", "adlı uygulanabilir bir yönteme DropDownListForsahip değil, ancak bu ada göre bir uzantı yöntemine sahip görünüyor. Uzantı yöntemleri dinamik olarak gönderilemez. Dinamik bağımsız değişkenleri çevirmeyi veya uzantı yöntemi sözdizimi olmadan uzantı yöntemini çağırmayı düşünün.

Hatayı anlayamıyorum, neyi kontrol etmeliyim?

Yanıtlar:


199

Desteklenmeyen uzantı yöntemlerinde dinamik türler kullanıyorsunuz.

Dinamik türleri gerçek türlere çevirin ve çalışacaktır.

Şimdi gördüğüm kadarıyla şunu söyleyebilirim:

(string) ViewBag.MagNo

Hangi sonuçlanır

@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' türü 'int' türüne dönüştürülemiyor diyor
nnmmss

3
@nnmmss sonra ViewBag.MagNo bir int değil, bir dizedir. Onu bir dizeye at ve altın olmalısın
bas

Bu cevap gerçek sorunu gerçekten ele almıyor - kod diğer projelerde döküm yapmadan çalışıyor, sadece onunkinde değil - muhtemelen bazı yapılandırma eksiklikleri var ve derleyicinin kafasının karışmasına neden oluyor. - Düzenleme: @ mkaj'ın cevabı asıl sorunu ele alıyor gibi görünüyor.
BrainSlugs83

ViewBag.MagNoBir bool?türe çevirebilir miyim ?
Dylan Czenski

Bir tamsayı geçiriyordum. Ne yaptım (string) ViewBag.MyNumber.ToString (). Sadece ToString () veya (string) eklemek istisna atar. Evet bunu da tuhaf buldum.
SZT

44

Bu sorun için düzeltmem şunu eklemekti:

    @model MyModel

Kısmi kontrolün tepesinde. Ben unutmuştum.


Teşekkürler, görüşlerimi başka bir projeye taşıyordum ve @ modelini unuttum, teşekkürler!
rochasdv

3
Küçük model yerine büyük @ Model kullanırsanız da bu hatayı alırsınız.
Timothy Kanski

5

MVC uzatma yöntemleri konusunu genişletmek için (bu soruya bu şekilde rastladım), connection.Query()sonuçları bir IEnumerable<dynamic>.

Dinamik nesneleri şu şekilde kullanmak da mümkündür:

  • Jon Skeet'in cevabına göre statik yöntemi doğrudan çağırmak :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
  • Bir sınıfa sarmak.

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

    Ardından MVC Görünümünüzde:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.