C# 如何在MVC中实现多个下拉列表
假设我想使用@Html.DropDownList在一个视图中显示多个下拉框,每个下拉框中都有相同的值。 是否有一种简单的方法可以渲染所有这些下拉框,而不必将ViewBag之类的东西绑定到每个返回的月份 例如:C# 如何在MVC中实现多个下拉列表,c#,javascript,jquery,asp.net-mvc-3,C#,Javascript,Jquery,Asp.net Mvc 3,假设我想使用@Html.DropDownList在一个视图中显示多个下拉框,每个下拉框中都有相同的值。 是否有一种简单的方法可以渲染所有这些下拉框,而不必将ViewBag之类的东西绑定到每个返回的月份 例如: @Html.DropDownListFor( m => m.PickedValue1, ViewBag.Values) @Html.DropDownListFor( m => m.PickedValue2, ViewBag.Values) 控制器 List<Sele
@Html.DropDownListFor( m => m.PickedValue1, ViewBag.Values)
@Html.DropDownListFor( m => m.PickedValue2, ViewBag.Values)
控制器
List<SelectListItem> items = new List<SelectListItem>();
var values = (from v in db.Values select v);
foreach (var value in values)
{
items.Add(new SelectListItem { Text = value.Name, Value = value.Id });
}
ViewBag.Values = PopulateSelectList("Values");
但我们的目标是拥有
<div class="control-group">
@Html.LabelFor(model => model.DesignStyle)
<div class="controls">
@Html.DropDownList("Values") @Html.DropDownList("Values")
@Html.DropDownList("Values") @Html.DropDownList("Values")
@Html.DropDownList("Values") @Html.DropDownList("Values")
@Html.DropDownList("Values") @Html.DropDownList("Values")
@Html.DropDownList("Values") @Html.DropDownList("Values")
</div>
</div>
我不想做的是重复逻辑多次填充SelectListItem,并将它们分别放在一个单独的ViewBag项目中。您可以重复使用选择列表-只需使用正确的覆盖或。你应该(通常)给下拉列表起不同的名字。 例如:
@Html.DropDownListFor( m => m.PickedValue1, ViewBag.Values)
@Html.DropDownListFor( m => m.PickedValue2, ViewBag.Values)
或者,如果您喜欢非强类型的下拉列表
:
@Html.DropDownList( "PickedValue1", ViewBag.Values)
@Html.DropDownList( "PickedValue2", ViewBag.Values)
我最终使用EditorTemplate功能来解决/渲染这个问题 模型从以下内容更改:
public class ValueModel
{
public Guid Id { get; set; }
public string Name { get; set; }
}
为此:
public class ValueModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<ValueDropDownModel> DropDown { get; set; }
}
public class ValueDropDownModel
{
[Range(0, 15)]
public int DropDown { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public List<SelectListItem> AvailableDropDown { get; set; }
}
ValueDropDownModel.cshtml
包含:
@model SomeSolution.Web.Models.ValueModel
<div class="row-fluid">
<div class="span6">
<div class="control-group">
@Html.LabelFor(m => m.Name)
<div class="controls">
@Html.EditorFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
</div>
</div>
</div>
</div>
<div class="row-fluid">
<div class="span4">
@for (int i = 0; i < 5; ++i)
{
@Html.EditorFor(m => m.DropDown[i])
}
</div>
<div class="span4">
@for (int i = 5; i < 10; ++i)
{
@Html.EditorFor(m => m.DropDown[i])
}
</div>
<div class="span4">
@for (int i = 10; i < 15; ++i)
{
@Html.EditorFor(m => m.DropDown[i])
}
</div>
</div>
@model SomeSolution.Web.Models.ValueDropDownModel
<div class="control-group">
@Html.HiddenFor(m => m.DropDown)
@String.Format("DropDown {0}", Model.DropDown)
<div class="controls">
@Html.DropDownListFor(m => m.Id, Model.AvailableDropDown)
@Html.ValidationMessageFor(m => m.Id)
</div>
</div>
在
Create
ActionResult
以及Edit
ActionResult
上调用FillAvailableValues
方法来初始化下拉列表。在Create
ActionResult
上调用InitDefaultDropDown
方法来设置页面上的下拉列表。感谢您的建议,但无法按我所希望的那样工作。不会选择值1,值2,值n。。。每个都必须填充。与此类似,您将如何使其更具活力。比如说,如果下拉列表的数量不一致,那么每次呈现该页面时,可能会有1到5个下拉列表。不希望硬编码“PickedValue1”等。@EbbnFlow Simple-使用循环。您可能需要某种容器(例如,列表
),其中包含要呈现的下拉列表,然后只需在列表中循环并为容器中的每个项目添加下拉列表。列表是视图模型的一部分。谢谢。列表容器内的模型中是否也应该有“SelectedValue”字符串属性?@EbbnFlow,这取决于您将如何使用发布的值。有关详细信息,请查看模型活页夹的工作原理。”这是对数组的解释。
@model SomeSolution.Web.Models.ValueDropDownModel
<div class="control-group">
@Html.HiddenFor(m => m.DropDown)
@String.Format("DropDown {0}", Model.DropDown)
<div class="controls">
@Html.DropDownListFor(m => m.Id, Model.AvailableDropDown)
@Html.ValidationMessageFor(m => m.Id)
</div>
</div>
private void FillAvailableValues(ValueModel modelValue, Entities db)
{
var values = (from v in db.Values
orderby v.Name
select v);
foreach (var model in modelValue.Values)
{
model.AvailableDropDown = new List<SelectListItem>();
model.AvailableDropDown.Add(new SelectListItem()
{
Text = "Unassigned",
Value = "0",
Selected = (model.Id == 0)
});
foreach (var value in values)
{
model.AvailableDropDown.Add(new SelectListItem()
{
Text = value.Name,
Value = value.Id,
Selected = (model.Id.ToString() == colour.Id)
});
}
}
}
private void InitDefaultDropDown(ValueModel model)
{
model.DropDown = new List<ValueDropDownModel>();
for (int i = 0; i < 15; i++)
{
model.DropDown.Add(new ValueDropDownModel()
{
DropDown = i + 1,
Id = 0
});
}
}