我正在尝试学习MVC3,在我正在做的一个练习中,我已经定义了DropDownListFor,就像这样:
@Html.DropDownListFor(m => m.Animal,
new System.Web.Mvc.SelectList(Model.AvailableValues, "Value",
"Text", Model.Animal))
其中Model.Animal的类型为AnimalEnum:
public enum AnimalEnum
{
Cat,
Dog,
Fox,
Aardvark
}
AvailableValues定义为:
var model = definition.Settings.GetModel<AnimalTypePart>();
model.AvailableValues = Enum.GetValues(typeof (AnimalEnum))
.Cast<int>()
.Select(i =>
new {
Text = Enum.GetName(typeof (AnimalEnum), i),
Value = i
});
我的问题是我能够正确保存我在下拉列表中选择的值,但是当我再次显示下拉列表时,它不显示保存的值,而是始终显示列表的第一个(猫)。我还尝试将“(int)Model.Animal”作为DropDownListFor的最后一个参数,它对应于与每个选项关联的整数值,但它也不起作用。调试我可以确认在调用帮助程序时DropDownListFor的所有参数都具有正确的值。 我可以帮助我让下拉列表在我可视化页面时自动显示保存的值吗?
答案 0 :(得分:0)
您必须将索引作为值传递给选定的参数,前提是您使用枚举项的索引作为选择中的值:
var model = definition.Settings.GetModel<AnimalTypePart>();
model.AvailableValues = Enum.GetValues(typeof (AnimalEnum))
.Cast<int>()
.Select(i =>
new {
Text = Enum.GetName(typeof (AnimalEnum), i),
Value = i,
Selected = i == (int)model.Animal
});
同样,DropDownListFor
的最后一个参数是htmlAttributes
,您正在传递Model.Animal
,删除它。
答案 1 :(得分:0)
您需要定义一个属性,以便在模型中保存选定值。
此属性还需要存在于可用选项中可供选择的值列表中。
这样,如果在模型中设置了模型并且在帖子中保留了选定的值,模型将自动重新绑定到选定的值。
以下是如何执行此操作的示例。
<强> Working example 强>
<强>模型强>
public class MyViewModel
{
public string SelectedAnimalId { get; set; }
public IEnumerable<SelectListItem> AvailableValues { get; set; }
}
请注意SelectedAnimalId
属性,该属性将保存所选的值,即字符串。这是enum的转换int属性,即cat = 0,dog = 1等,它保存在所选列表项的值中。
<强>控制器强>
[HttpGet]
public ActionResult Index()
{
var model = new MyViewModel();
model.AvailableValues = PopulatedDropDown;
model.SelectedAnimalId = "1";
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
// Save it to db and rebind the selected
model.AvailableValues = PopulatedDropDown;
return View(model);
}
// helper property to populate from the enum
private IEnumerable<SelectListItem> PopulatedDropDown
{
get {
var enumList = Enum.GetValues(typeof (AnimalEnum))
.Cast<int>()
.Select(i =>
new SelectListItem {
Text = Enum.GetName(typeof (AnimalEnum), i),
Value = i.ToString()
});
return enumList;
}
}
在获取可用选项的列表中填充,SelectedAnimalId
设置为列表中的第二个。请注意工作示例中的重新绑定。
帖子只是传递模型并显示在视图中选择了哪个项目。
查看强>
@using (Html.BeginForm())
{
@Html.DropDownListFor(m => m.SelectedAnimalId,
Model.AvailableValues)
<input type="submit" class="btn btn-primary" value="Submit" />
}
Selected Item:
@Model.SelectedAnimalId
上面只是将SelectedAnimalId
设置为第一个参数,然后使用绑定列表作为选项。