0

我有一个使用文本框进行输入的视图。我需要换出文本框并使用下拉列表。只有三个,我想手工制作,而不是代码生成和重新应用任何调整。

我进行了数据库更改。我将字段更改为 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>

我在视图模型中添加了以下代码:

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'.

我该如何解决?

4

2 回答 2

1

虽然现在是3,但未来可能会增加。所以不要通过向视图模型添加 3 个属性来硬编码 3 个项目。您应该做的是在您的视图模型中保留一个集合,以便根据需要在其中包含 n 个项目。还要尽量避免动态的东西,比如 ViewBag 和 ViewData。使用强类型方法。所以让我们像这样改变你的视图模型

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 将位于SelectedLateralityCustomerViewModel 的属性中。

[HttpPost]
public ActionResult Add(CustomerViewModel model)
{
  // check model.SelectedLaterality
  //to do : Save and redirect.
}
于 2013-03-06T19:31:21.283 回答
1

它缺少您尚未传递给 DropDownList 的数据源。上的 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)在视图上,你可以这样做:

@Html.DropDownListFor(model => model.LateralDominanceLaterality, ViewBag.LateralDominanceLaterality)
于 2013-03-06T19:08:59.950 回答