2015-08-04 18 views
8

Şu anda asp.net 5'de taghelpers kullanmaya çalışıyorum. ViewBag'dan bir listeyle bir select tag helper kullanmak istiyorum. Asp-for alanına koyduğum her şey bana bir hata veriyor çünkü görüntü torbası yerine IEnumerable olan modelden çekmeye çalışıyor. BununlaSelect TagHelper ViewBag Listesinden Kullanılıyor

@model IEnumerable<InvoiceIT.Models.Invoice> 
@using (Html.BeginForm()) 
{ 
    <p>    
     @Html.DropDownList("Companies", String.Empty)  
     <input type="submit" value="Filter" class="btn btn-default" /> 
    </p> 
} 

:

Bunu değiştirmek istiyor

ViewBag.Companies = new SelectList(await DbContext.Company.ToListAsync(), "CompanyID", "Name"); 

cevap

9

Model özniteliğinin doğrudan istemesini istemiyorsanız, bu davranışı bir @ sağlayarak geçersiz kılabilirsiniz.

Aka:

nedenle
<select asp-for="@ViewBag.XYZ"> 
    ... 
</select> 

, hani biraz olur inanıyoruz söylediklerini alarak:

@model IEnumerable<InvoiceIT.Models.Invoice> 
<form asp-controller="Invoice" asp-action="Index" method="post" class="form-horizontal" role="form"> 
@{ 
    SelectList companies = ViewBag.Companies; 
    var currentlySelectedIndex = 0; // Currently selected index (usually will come from model) 
} 
    <select asp-for="@currentlySelectedIndex" asp-items="companies" class="form-control"> 
    </select> 
    <input type="submit" value="Save" class="btn btn-default" /> 
</form> 

Umarım bu yardımcı olur!

+0

Tam kodunuzu kullanarak asp-for alanında bir derleme hatası alıyorum: 'bir ifade ağacı dinamik bir işlem içermiyor olabilir'. – Reafidy

+0

Ahh, iyi nokta. Doğru kullanımı yansıtacak şekilde güncellenmiş yanıt (@ @ {} 'içinde eklenen bitlere bakın). –

+0

Bu, bir derleme yerine bir liste kutusu türü denetimi ekler, ancak veri boş olduğundan, bu derleme olarak daha yakın oluyor gibi görünüyor. Eğer bunu "asp-for =" @ company "asp-items =" @ ViewBag.Companies "olarak değiştirirsem, o zaman aynı liste kutusunu alırım ancak doğru veriye sahip olurum. Bunun yerine açılır menüyü nasıl alabilirim? – Reafidy

0

sizin gibi deneyebilirsiniz:

İşte
@model IEnumerable<InvoiceIT.Models.Invoice> 
<form asp-controller="Invoice" asp-action="Index" method="post" class="form-horizontal" role="form"> 
    <select asp-for="????" asp-items="ViewBag.Companies" class="form-control"> 
    </select> 
    <input type="submit" value="Save" class="btn btn-default" /> 
</form> 

ben denetleyicisi, seçilen listesini doldurmak nasıl bu ...

@Html.DropDownListFor(model => model.Id_TourCategory, new SelectList(ViewBag.TourCate, "Value", "Text")) 

public ActionResult TourPackage() 
    { 
     List<TourCategory> lst = new List<TourCategory>(); 
     lst = db.TourCategories.ToList(); 
     ViewBag.TourCate = new SelectList(lst, "Id", "CategoryName");   
     return View(); 
    } 
+0

Umm teşekkürler ama bir DropDownList için çalıştığım kod, bu noktada bir taghelper kullanmaya çalışıyorum. – Reafidy

3

asp-için sadece seçilen geçerli değer ve asp-eşyalarla özellik bu pasajı projemde kodu çalışmasını bir

IEnumerable<SelectListItem> 

olması gerekir olması gerekiyor:

<select id="CompanyCountry" asp-for="CompanyCountry" 
      asp-items="Model.AvailableCountries" class="form-control"></select> 

benim modelinde ben AvailableCountries

için

IList<SelectListItem> 

kullanıyorum

+0

böylece örnek için ViewBag.CompanyID gibi görünüyor asp-for ve asp-öğeler olmalıdır şirketleri temsil eden liste öğeleri listesinde olmalıdır –

+0

Hey Joe, Ben soru güncelledik. Asp-for alanına companyID yerleştirdiğimde bir hata alıyorum: 'IEnumerable companyID' tanımı içermiyor. Bunun nedeni, viewbag'i bir kaynak olarak kullanmaya çalışıyorum ve modelde değil, yalnızca viewbag kaynağında var. – Reafidy

+0

@ ViewBag.companyID'yi kullanmayı denediniz mi? Asp-for'un model ciltleme için olduğunu düşünüyorum; asp-for, selectlistitems'deki bir değere karşılık gelen bir değer içeren modelin bir özelliği olmalıdır. Bu fikir, kullanıcı için farklı bir değer seçtiğinde ve formu gönderirse, mülkün geçerli değeri seçili olur, yeni seçili değer, formun gönderiminde sizin için otomatik olarak model özelliğine bağlı olacaktır, böylece kaydedebilirsiniz Yeni seçilen değerle model –