Как я могу динамически добавлять элементы в выпадающий список с помощью Razor / MVC 5? - PullRequest
1 голос
/ 06 марта 2020

Мне нужно изменить следующий выпадающий список в моем приложении asp. net, теперь я должен добавить значения в зависимости от типа пользователя, который раньше не требовался. Следующий код работает нормально, но, очевидно, я жестко кодирую ввод элементов.

@Html.DropDownListFor(
    model => model.Vote, 
    new SelectList(
        new List<SelectListItem> {
            new SelectListItem { Selected=true, Text = "Randy", Value = "1" }, 
            new SelectListItem { Selected=false, Text = "Richard", Value = "2" },
            new SelectListItem { Selected=false, Text = "Bubbles", Value = "3" }, 
            new SelectListItem { Selected=false, Text = "Julian", Value = "4" } 
        }, 
        "Value", 
        "Text"
    ), 
    htmlAttributes: new { @class = "form-control" }
)

Я получаю список от контроллера и могу через него l oop, но я ' я не могу использовать эту информацию как SelectListItem s. Obvioulsy, первый и последний SelectListItem s являются специальными, первый имеет свойство Selected, установленное на true, в то время как остальные установлены на false, таким образом, первый выбирается по умолчанию , Последний, с другой стороны, не имеет запятой перед закрывающим тегом }, как это делают предыдущие, так вот как я зацикливаюсь.

@for (var i = 0; i < candidatos.Count(); i++)
{
    if (i == 0)
    {
        <h4>"First candidate:" + candidatos.ElementAt(i)</h4>
    }
    else if (i < candidatos.Count() - 1)
    {
        <h4>"Not first nor last:" + candidatos.ElementAt(i)</h4>
    }
    else
    {
        <h4>"Last candidate:" + candidatos.ElementAt(i)</h4>
    }
}

Так что это вывод правильно, но мне действительно нужна помощь с синтаксисом, я изо всех сил пытался объединить эту итерацию с синтаксисом, который я жестко запрограммировал и правильно показывает элементы как элементы в выпадающем списке, но пока не могу понять, как это сделать.

Вот как я пытался объединить обе вещи, но я получаю ошибки.

@Html.DropDownListFor(model => model.Voto, new SelectList(new List<SelectListItem> { 
    for (var i = 0; i < candidatos.Count(); i++)
{
    if (i == 0)
    {
        new SelectListItem { Selected = true, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() },
    }
    else if (i < candidatos.Count() - 1)
    {
        { new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() },
    }
    else
    {
        { new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() } }, "Value", "Text" ),
            htmlAttributes: new { @class = "form-control" })
    }
}

браузер кричит на меня, говоря, что выражение нуждается в закрытии } после

@Html.DropDownListFor(model => model.Voto, new SelectList(new List<SelectListItem> { 

Я думаю, он не осознает, что я предоставляю соответствующие закрывающие теги и пропускаю элементы, используя for для l oop, но, очевидно, потому что я делаю это неправильно.

1 Ответ

1 голос
/ 06 марта 2020

Первое, что нужно сделать, это создать новую переменную, в которой будет храниться наш SelectListItem. Затем мы проведем итерацию по нашим «кандидатам» и добавим новый элемент со свойствами, которые будут установлены с учетом вашей логики c.

@{ 
    var selectListItems = new List<SelectListItem>();

    for (int i = 0; i < candidatos.Count(); i++)
    {
        if (i == 0)
        {
            selectListItems.Add(new SelectListItem { Selected = true, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() });
        }
        else if (i < candidatos.Count() - 1)
        {
             selectListItems.Add(new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() });
        }
        else
        {
             selectListItems.Add(new SelectListItem { Selected = false, Text = candidatos.ElementAt(i + 1), Value = (i + 2).ToString() });
        }
    }
}

В конце вы передадите новый сгенерированный перечислите в качестве второго параметра метода DropDownListFor класса Html.

@Html.DropDownListFor(m => m.Voto, selectListItems, htmlAttributes: new { @class = "form-control" });

Я надеюсь, что мое решение подойдет вам. Дайте знать, если у вас появятся вопросы.

...