不能在下拉列表中选择项目
本文关键字:选择 项目 下拉列表 不能 | 更新日期: 2023-09-27 18:18:15
我正在尝试学习MVC3,在一个练习中,我正在做我已经定义了一个DropDownListFor像这样:
@Html.DropDownListFor(m => m.Animal,
new System.Web.Mvc.SelectList(Model.AvailableValues, "Value",
"Text", 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
});
我的问题是,我能够正确地保存我在下拉列表中选择的值,但是当我再次显示下拉列表时,它不显示保存的值,而是总是显示列表(Cat)的第一个。我还试着输入"(int)Model"。Animal"作为DropDownListFor的最后一个参数,它对应于与每个选项关联的整数值,但它也不起作用。调试时,我可以确认当调用helper时,DropDownListFor的所有参数都具有正确的值。你能帮我有下拉列表自动显示保存值时,我可视化的页面?
如果要使用Enum项的索引作为select:
中的值,则必须将索引作为所选参数的值传递。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
,请删除它
您需要定义一个属性,该属性将在您的模型中保存选定值。
此属性还需要存在于可用选项中可供选择的值列表中。
这样,你的模型将自动重新绑定到选定的值,如果它在模型中被设置,并且在post中也保留选定的值。
下面是一个示例。
工作示例
public class MyViewModel
{
public string SelectedAnimalId { get; set; }
public IEnumerable<SelectListItem> AvailableValues { get; set; }
}
请注意SelectedAnimalId
属性,它将保存所选值,这是一个字符串。这是被转换成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;
}
}
在get中填充可用选项列表,并将SelectedAnimalId
设置为列表中的第二个选项。注意工作示例中的重新绑定。
post简单地传递模型并显示视图中已选中的项目。
<<p> 视图/strong>@using (Html.BeginForm())
{
@Html.DropDownListFor(m => m.SelectedAnimalId,
Model.AvailableValues)
<input type="submit" class="btn btn-primary" value="Submit" />
}
Selected Item:
@Model.SelectedAnimalId
上面的代码只是将SelectedAnimalId
设置为第一个参数,然后使用绑定列表作为选项。