Я хочу связать CheckBoxList на странице Razor с Viewdata. У меня есть следующий код в моем индексе контроллера:
public async Task<IActionResult> Index()
{
var testSections = new List<ReassignmentSectionLookup>();
testSections = await _employeeService.GetTestSections();
ViewData["testSections"] = new SelectList(testSections, "ReassignmentSectionLookupID", "Section");
return View();
}
У меня на странице бритвы есть следующее:
<div class = "form-group row">
<div class = "col-md-12">
Select Test: <br />
@{
var select = ViewData["testSections"] as SelectList;
if (select != null && select.ToList().Count > 0)
{
foreach (var item in select.ToList())
{
<input type = "checkbox" name = "selectedItems" value = "@item.Value" @(Html.Raw(item.Selected ? "checked=\"checked\"" : "")) /> @item.Text <br />
}
}
}
</div>
При наведении курсора на выбор я вижу 12 элементов в списке:
когда я наводил курсор на select.ToList().Count, я получаю сообщение об ошибке «system.NullReferenceException». Я не уверен, что я делаю неправильно. Я вижу данные в select. ниже скриншот ошибки:
Если я попытаюсь сделать select.Items.ToList(), я получаю эту ошибку:
При использовании этой строки:
<input type = "checkbox" name = "selectedItems" value = "@item.Value" @(Html.Raw(item.Selected ? "checked=\"checked\"" : "")) /> @item.Text <br />
Я получаю эту ошибку:
Если я выберу select.Items.ToList().Count, я получаю еще одну ошибку. Я вставил скриншот ошибки в свой исходный пост.
Попробуйте поставить @using System.Linq
в верхней части вашего cshtml.
Просто любопытно, почему бы не вернуть список с моделью, содержащей как свойство «ReassignmentSectionLookupID», так и свойство «Section» вместо использования SelectList
? С моей точки зрения, SelectList
используется, когда вы визуализируете набор данных в виде раскрывающегося списка с tag-helper (asp-items) или HtmlHelper (@Html.DropdownList()
).
Можете ли вы привести пример для этого
Как обсуждалось в комментарии, я бы сказал, что SelectList
не подходит, поскольку он используется для рендеринга элементов для выбора/раскрывающегося списка либо с помощью помощника по тегам (asp-items
), либо с помощью HtmlHelper (@Html.DropdownList()
).
public class ReassignmentSectionLookupOption
{
public string Text { get; set; }
public int Value { get; set; }
public bool Selected { get; set; }
}
SelectList
в ViewData
, верните как List<ReassignmentSectionLookupOption>
тип.public async Task<IActionResult> Index()
{
var testSections = await _employeeService.GetTestSections();
ViewData["testSections"] = testSections
.Select(x => new ReassignmentSectionLookupOption { Value = x.ReassignmentSectionLookupID, Text = x.Section })
.ToList();
return View();
}
ViewData
к List<ReassignmentSectionLookupOption>
. И вы можете использовать .Any()
, чтобы проверить, не пуст ли список.@{
var testSections = ViewData["testSections"] as List<ReassignmentSectionLookupOption>;
if (testSections != null && testSections.Any())
{
foreach (var item in testSections)
{
<input type = "checkbox" name = "selectedItems" value = "@item.Value" @(Html.Raw(item.Selected ? "checked=\"checked\"" : "")) /> @item.Text <br />
}
}
}
Я получаю небольшую ошибку, когда помещаю эту строку в режим бритвы: <input type = "checkbox" name = "selectedItems" value = "@item.Value" @(Html.Raw(item.Selected ? "checked=\" проверено\"" : "")) /> @item.Text <br /> } Я поместил снимок экрана в свой исходный пост.
Привет, кстати, тебе не нужна часть item.Selected
. Если вы заинтересованы, вам нужно добавить свойство Selected
в класс ReassignmentSectionLookupOption
.
хорошо понял. Когда я делаю HTTPPost, я не вижу отмеченных значений. Поскольку это отдельный вопрос, я могу опубликовать этот вопрос отдельно.
Так должно быть
select.Items.ToList().Count > 0