我有一个使用文本框输入的视图。我需要换出文本框并使用下拉列表。只有三个,我想手工制作而不是代码生成并重新应用任何调整。
我对数据库进行了更改。我将字段更改为FK的int而不是varchar(50)。
我更新了EF数据模型并确认FK已正确映射。
我在视图中更改了标记。我从此应用程序的其他位置复制了此下拉列表的代码。
<div class="LabelAndField">
<div class="editor-label-score">
@Html.LabelFor(model => model.FootLateralDominanceLateralityId)
</div>
<div class="editor-field-score">
@Html.DropDownList("LateralDominanceLaterality", String.Empty)
@Html.ValidationMessageFor(model => model.FootLateralDominanceLateralityId)
</div>
</div>
我将以下代码添加到viewmodel:
public virtual LateralDominanceLaterality LateralDominanceLaterality { get; set; }
public virtual LateralDominanceLaterality LateralDominanceLaterality1 { get; set; }
public virtual LateralDominanceLaterality LateralDominanceLaterality2 { get; set; }
当我运行应用程序并导航到此视图时,我得到以下异常:
There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'LateralDominanceLaterality'.
我该如何解决这个问题?
答案 0 :(得分:1)
它缺少您未传递给DropDownList的数据源。 asp.net-mvc上的DropDownList与名为SelectList
的类一起使用,您可以将IEnumerable
的任何实现传递给它,以及要在此控件上绑定的值和文本的属性名称。尝试这样的事情:
1)在控制器上使用您的属性名称在ViewBag上设置一个键
var list = /* build an List you want to show, for sample: List<LateralDominanceLaterality> */;
// create a SelectList to fill the combo with the sintax of the .ctor (list, value property, text property), e.g.:
var items = new SelectList(list, "Id", "Description");
// set on the ViewBag
ViewBag.LateralDominanceLaterality = items;
2)在View上,您可以这样做:
@Html.DropDownListFor(model => model.LateralDominanceLaterality, ViewBag.LateralDominanceLaterality)
答案 1 :(得分:1)
即使现在它是3,但将来可能会增加。因此,不要通过向视图模型添加3个属性来硬编码3个项目。你应该做的是在你的viewmodel中保留一个集合,根据需要在其中包含n个项目。还要尽量避免像ViewBag和ViewData这样的动态内容。使用强类型方法。所以让我们像这样改变你的viewmodel
public class CustomerViewModel
{
//Your other existing properties of the viewmodel goes here
public List<SelectListItem> Lateralities { set;get;}
public int SelectedLaterality { set;get;}
public CustomerViewModel()
{
Lateralities =new List<SelectListItem>();
}
}
现在,在您的GET Action方法中,设置Lateralities
集合的项目,并将viewmodel对象发送到我们的视图。
public ActionResult Add()
{
var vm=new CustomerViewModel();
//The below is hard code for adding 3 items to the collection.
//You may replace it with data from your table/data access layer
vm.Lateralities.Add(new SelectListItem { Value="1", Text="Item 1"});
vm.Lateralities.Add(new SelectListItem { Value="2", Text="Item 2"});
vm.Lateralities.Add(new SelectListItem { Value="3", Text="Item 3"});
return View(vm);
}
并且在我们强烈输入CustomerViewmodel
的视图中,使用Html.DropDownListFor
辅助方法
@model CustomerViewModel
@using(Html.Beginform())
{
@Html.DropdownListFor(x=>x.SelectedLaterality,
new SelectList(Model.Lateralities,"Value","Text"),"select")
<input type="submit" />
}
发布表单后,所选项ID将位于CustomerViewModel的SelectedLaterality
属性中。
[HttpPost]
public ActionResult Add(CustomerViewModel model)
{
// check model.SelectedLaterality
//to do : Save and redirect.
}