2015-08-04 1 views
8

В настоящее время я пытаюсь использовать taghelpers в asp.net 5. Я хочу использовать помощник тега select со списком из ViewBag. Все, что я вставляю в поле asp-for, дает мне ошибку, потому что он пытается вытащить его из модели, которая является IEnumerable вместо мешка представления.Выберите TagHelper, используя List из ViewBag

Я хочу, чтобы заменить это:

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

с этим:

@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> 

Вот как я заполнить список выбора в контроллере:

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

ответ

9

Если вы не хотите, чтобы атрибут asp-for вытащил из Model, вы можете переопределить это поведение, предоставив @.

Ака:

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

Таким образом, основываясь на том, что вы сказали, я полагаю, ваш бит становится:

@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> 

Надеется, что это помогает!

+0

Используя ваш точный код, я получаю ошибку компиляции в поле asp-for: «дерево выражений не может содержать динамическую операцию». – Reafidy

+0

Ahh, хорошая точка. Обновленный ответ, отражающий правильное использование (см. Добавленные биты внутри '@ {}'). –

+0

Кажется, что он приближается по мере его компиляции, однако вместо раскрывающегося списка он добавляет элемент управления списком, и он не содержит данных. Если я изменю его на 'asp-for =" @ company "asp-items =" @ ViewBag.Companies ", тогда я получаю тот же список, но в нем есть правильные данные. Как мне получить раскрывающийся список? – Reafidy

0

вы можете попробовать, как это ...

@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

Умм спасибо, но код, который у меня есть для DropDownList, я пытаюсь использовать taghelper. – Reafidy

3

жерех-чуть должно быть свойство с текущим выбранным значением и АСП-элементов должно быть

IEnumerable<SelectListItem> 

этот фрагмент от рабочего кода в моем проекте:

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

в моей модели я использую

IList<SelectListItem> 

для AvailableCountries

+0

, поэтому для вашего примера выглядит ViewBag.CompanyID должен быть включен asp-for, а asp-items должен быть списком элементов списка избранного, представляющих компании –

+0

Привет, Джо, я обновил вопрос. Когда я помещаю идентификатор компании в поле asp-for, я получаю сообщение об ошибке: «IEnumerable не содержит определения для companyID». Я считаю, что это потому, что я пытаюсь использовать viewbag как источник, а companyid существует только в источнике viewbag, а не в модели. – Reafidy

+0

Вы пытались использовать @ ViewBag.companyID? Я думаю, что asp-for предназначен для привязки к модели, тогда как viewbag предназначен для отображения. asp-for должно быть свойством модели, которая содержит значение, соответствующее значению в selectlistitems. идея заключается в том, чтобы получить текущее значение для свойства, будет выбрано, если пользователь выберет другое значение и отправит форму, новое выбранное значение будет привязано к свойству модели автоматически для вас в сообщении формы, чтобы вы могли сэкономить модель с новым выбранным значением –