假设我想在View中使用@ Html.DropDownList显示多个下拉框,每个下拉框中包含相同的值。 是否有一种简单的方法可以渲染所有这些下拉框而无需将ViewBag之类的东西绑定到返回的每个月?
例如:
控制器
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");
查看
@Html.DropDownList("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>
我的猜测是我需要某种@foreach (item in Model)
来填充视图中的每个DropDowns
以下是我最初想法如何实现目标的样本。
List<SelectListItem> results = new List<SelectListItem>();
SelectListItem item = null;
var values = (from v in db.Values select v);
for (int i = 0; i <= 15; i++)
{
item = new SelectListItem();
item.Text = "Select a value";
item.Value = "1";
results.Add(item);
foreach (var thread in threads)
{
item.Text = thread.Name;
item.Value = thread.Id;
results.Add(item);
}
}
我不想做的是复制逻辑以多次填充SelectListItem并将其中的每一个放在单独的ViewBag项中。
答案 0 :(得分:4)
您可以重复使用选择列表 - 只需使用DropDownList
或DropDownListFor
的正确覆盖。你应该(通常)做的是给下拉菜单不同的名字。
例如:
@Html.DropDownListFor( m => m.PickedValue1, ViewBag.Values)
@Html.DropDownListFor( m => m.PickedValue2, ViewBag.Values)
或者,如果您更喜欢非强类型DropDownList
:
@Html.DropDownList( "PickedValue1", ViewBag.Values)
@Html.DropDownList( "PickedValue2", ViewBag.Values)
答案 1 :(得分:0)
我最终使用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; }
}
在Views
文件夹下的Value
内,现在有一个名为EditorTemplates
的子文件夹。这包含2个视图。 ValueModel.cshtml
和ValueDropDownModel.cshtml
。
ValueModel.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>
ValueDropDownModel.cshtml
包含:
@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>
ValueController
现在包含一些帮助方法来填充下拉列表
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
});
}
}
在FillAvailableValues
Create
以及ActionResult
Edit
上调用ActionResult
方法来初始化Drop Downs。在InitDefaultDropDown
Create
上调用ActionResult
方法,以在页面上设置Drop Downs。