如何使用 Razor/MVC 5 将元素动态添加到下拉列表
How can I dynamically add elements to a dropdownlist with Razor/MVC 5
我需要在我的 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" }
)
我正在从控制器接收列表,我可以遍历它,但我无法将此信息用作 SelectListItem
s。
很明显,第一个和最后一个 SelectListItem
是特殊的,第一个 属性 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 循环缺少元素,但很明显,因为我做错了。
首先要做的是创建一个新变量来存储我们的 SelectListItem。然后我们将迭代 "candidatos" 并添加一个新项目,其属性将根据您的逻辑进行设置。
@{
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() });
}
}
}
最后,您将把新生成的列表作为第二个参数传递给 Html class.
的 DropDownListFor 方法
@Html.DropDownListFor(m => m.Voto, selectListItems, htmlAttributes: new { @class = "form-control" });
希望我的解决方案能满足您的需求。如果您有任何问题,请告诉我。
我需要在我的 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" }
)
我正在从控制器接收列表,我可以遍历它,但我无法将此信息用作 SelectListItem
s。
很明显,第一个和最后一个 SelectListItem
是特殊的,第一个 属性 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 循环缺少元素,但很明显,因为我做错了。
首先要做的是创建一个新变量来存储我们的 SelectListItem。然后我们将迭代 "candidatos" 并添加一个新项目,其属性将根据您的逻辑进行设置。
@{
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() });
}
}
}
最后,您将把新生成的列表作为第二个参数传递给 Html class.
的 DropDownListFor 方法@Html.DropDownListFor(m => m.Voto, selectListItems, htmlAttributes: new { @class = "form-control" });
希望我的解决方案能满足您的需求。如果您有任何问题,请告诉我。