'Xxx' anahtarına sahip 'IEnumerable <SelectListItem>' türünde ViewData öğesi yok


87

Stack Overflow'da bununla ilgili birkaç gönderi var, ancak mevcut durumumdaki sorunu çözecek gibi görünen bir cevap yok.

İçinde tablo olan bir sayfam var, her satırda bir dizi metin alanı ve bir açılır menü var. Tüm açılır listelerin aynı SelectList verilerini kullanması gerekir, bu yüzden aşağıdaki gibi ayarladım:

Kontrolör

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

Görünüm

<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>

Bu kurulumu tam olarak birçok yerde kullandım, ancak bu belirli görünümde bazı nedenlerden dolayı şu hatayı alıyorum:

'Submarket_0' anahtarına sahip 'IEnumerable' türünde ViewData öğesi yok.


1
Bunu denedin mi <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>DropDownList alır IEnumerable<SelectListItem>.
LukLed

@LukLed - bu gerçekten de sonunda hatanın kaynağını bulmamın yolu :) ve diğer bazı gönderilerdeki bilgiler! Teşekkürler
Jimbo

<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
Arvis

Bugün bununla karşılaştım ve DropDownList yardımcımdaki ikinci argümanın @jonathansewell'den aşağıdaki bulguya göre boş olduğunu buldum.
Ken Palmer

Yanıtlar:


79

Tamam, yani cevap, bu sorunla ilgili diğer bazı gönderilerden türetildi ve şu:

Eğer senin ViewDatabir içerdiği SelectListiçin aynı adı taşıyan DropDownListyani "submarket_0", HTML yardımcısı otomatik olarak yerleştirilecektir DropDownListbu verilerle size 2 parametresini belirtmek yoksa bu durumda kaynak SelectList olduğunu.

Benim hatamla ne oldu:

Açılır listeleri içeren tablo kısmi bir görünümde olduğundan ve ViewDatadeğiştirilmiş olduğundan ve artık SelectListbaşvurduğum tabloyu içermediğinden ,HtmlHelper (bir hata atmak yerine) ViewData (GRRRR! !!) HALA bulamadığı ve sonra bir hata yaptı :)

Yanılıyorsam lütfen beni düzeltin


105
Bu hatayı aldım çünkü açılır liste için SelectListItems koleksiyonum boştu, ki bu senin düşündüğüm problemin aynısı.
Jonathan Sewell

6
Bu sorunla karşılaşan diğerleri için, aşağı açılır listenizi geçici olarak boş bir denetimle kaydırın, örneğin @if (ViewData ["Altmarketler"]! = Null). Görünüm daha sonra bir hata vermeden (ve açılır listeniz olmadan) işlenirse, sorununuzu tanımlamış olursunuz. "Veri öğesi görüntüleme yok" hatası bu durumda çok yanıltıcıdır.
GDB

Ben bunu bir Ajax.ActionLink. Sadece eklemek SelectList Getiçin ActionMethodAjax mesaj içermektedir.
kokar

Evet! Denetleyiciden ViewData'ya geçirdiğim listenin adını değiştirdim ve görünümde değiştirmemiştim. Bu gerçekten çok kafa karıştırıcı bir hata mesajıdır!
neminem

1
@JonathanSewell teşekkür ederim, teşekkür ederim, teşekkür ederim! Bu benim tam sorunumdu.
johnw182

30

Eski soru, ama işte sorunun başka bir açıklaması. Görünümleri güçlü bir şekilde yazmış olsanız ve açılır listenizi oluşturmak için ViewData'yı kullanmasanız bile bu hatayı alırsınız. MVC kaynağına baktığınızda hatanın nedeni netleşebilir :

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

Yani şuna benzer bir şeye sahipseniz:

@Html.DropDownList("MyList", Model.DropDownData, "")

Ve Model.DropDownDatanull, MVC adlı MyListbir şey için ViewData'nıza bakar ve ViewData'da bu ada sahip bir nesne yoksa bir hata atar.


1
Merhaba, bu benim de sorunum , Liste boşsa ne yapacağız ! bir şey önerebilir misin,
transformer

4
@transformer Yapılacak en kolay şey, Model.DropDownData öğesini null yerine boş bir listeye ayarlamaktır. Bu mümkün değilse, listenin boş olup olmadığını kontrol etmek için ustura işaretlemenizi değiştirebilir ve eğer öyleyse boş bir seçim listesi oluşturabilirsiniz.
hawkke

15

Ben de aynı hatayı yaşadım, sanırım sorun, yanlış bir anahtar adı verdiği için hata metninin kafa karıştırıcı olmasıdır.

Sizin durumunuzda "Submarkets" anahtarına sahip 'IEnumerable' türünde ViewData öğesi yok "demelidir.

Benim hatam, görünüm kodunda (sizin "Alt Pazarlarınız") yanlış yazımdı, ancak hata metni beni çıldırttı.

Bu yanıtı gönderiyorum çünkü, benim gibi, bu hatayı arayan insanlara, sorunun IENumerable'ı bulmaması, ancak araması gereken varyasyonda (bu durumda "Altmarketler") olduğunu söylemek istiyorum. hata ile gösterilen değil ("submarket_0") .

Kabul edilen cevap çok ilginç, ancak dediğiniz gibi 2. parametreyi belirtmezseniz kural uygulanır, bu durumda belirtildi, ancak var bulunamadı (sizin durumunuzda, çünkü görünüm verileri yoktu, benim durumumda Var adını yanlış yazdım)

Bu yardımcı olur umarım!


9

Sorun, geri göndermenin gönder düğmesi tıklandığında gerçekleşmesidir. Bu nedenle, gönder üzerine veri gönderirken Görünüm () 'e dönmeden önce tekrar yazın

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

3

Ad Alanını kontrol edin.

Denetleyicide System.Web.Mvc.SelectListItem yerine System.Web.Webpages.Html.SelectListItem atayabilirsiniz .


1

Bu da sorun değil; Örneğin:
==> "NumberController" dosyasında:

public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number)
{
    if (ModelState.IsValid)
    {
        ...
        ...
        return RedirectToAction("Index");
    }
    ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", 
                                "OperatorSign", number.OperatorId);                
    return View();
}

==> Görünüm dosyasında (Create.cshtml):

<div class="form-group">
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = 
                   "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { 
                        @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Number1, "", new { @class = 
                                   "text-danger" })
    </div>
</div>

Şimdi bu ifadeyi kaldırırsak:

ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);

aşağıdaki ifadenin arkasından (denetleyicimizde):

return View();

bu hatayı göreceğiz:

'OperatorId' anahtarına sahip 'IEnumerable' türünde ViewData öğesi yok.

* Bu nedenle, bu ifadelerin mevcut olduğundan emin olun. *


0

Benim için, bu hataya neden olan sorun, veritabanına yeni bir satır kaydederken ortaya çıktı, ancak bir alan boştu. Veritabanı tablo tasarımında bu alan BOŞ DEĞİLDİR. Bu yüzden boş olmayan alan için boş değer içeren yeni bir satırı kaydetmeye çalıştığımda, Visual Studio bu hatayı attı. Böylece alana bir değer atandığından ve sorunun giderildiğinden emin oldum.


0

Benim durumumda, gönderi yöntemini yanlışlıkla özel olarak ayarladığımı fark ettim. özel olarak değiştirildikten sonra.

[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}

değişmek

[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}

Şimdi iyi çalışıyor.


0

Sebep, nesnelerin uygunsuz kullanımından ziyade sözdizimine aykırı değildir. ViewData, ViewBag ve View Life Cycle'daki nesnelerin Yaşam Döngüsü, oturumdakinden daha kısadır. Biçimlendiricilerde tanımlanan veriler bir istek yanıtından sonra kaybolacaktır (bir istek yanıtından sonra erişmeye çalışırsanız, istisnalar alırsınız). Bu nedenle, biçimlendiriciler, verileri geçici verileri depolamak için iken, Görünüm ve Denetleyici arasında veri geçirmek için uygundur. Geçici veriler, birçok kez erişilebilmesi için oturumda saklanmalıdır.


-1

Benim durumumda ad alanlarında bir çakışma vardı:

using System.Web.Mvc;

ve

using System.Collections.Generic;

Açıkça Mvc'yi kullanmak istiyorum, bu yüzden şu şekilde ilan ettim:

new System.Web.Mvc.SelectList(...)

1
Gözlerim beni aldatmak sürece, orada SelectListyer System.Collections.Generic.
Erik Philips
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.